c - 在 C 中打印字符串中的字符时出现分段错误
问题描述
我正在处理一项作业,并注意到当我尝试打印字符串的单个字符时遇到了 Seg Fault。这很奇怪,因为当我删除打印语句时没有分段错误。
我用更简单的代码简化了给我 Seg Fault 的那部分作业。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void printword( char **sptr){
int i;
for( i = 0; i < 6; ++i){
printf( "%c\n", *sptr[i]);
}
}
int main(){
char *sentence = "This is my sentence\n";
printf("Sentence is: %s", sentence);
printword( &sentence );
}
当我运行此代码时,仅打印第一个字母,然后在“?”之后 其次是“分段错误:11”。似乎我可以打印字符串中的任何字符,但是,只有 1 个字符是我在段错误之前的限制。我不明白为什么这是一个问题,因为我只是在打印。
解决方案
这是一个优先问题。*sptr[i]
解析为*(sptr[i])
,但您需要(*sptr)[i]
.
它崩溃是因为sptr[i]
意味着*(sptr + i)
,即在i = 0
你只是取消引用sptr
(给你sentence
),然后取消引用,给你*sentence
(即第一个字符sentence
)。但是在i = 1
你正在做sptr[1]
(即*(sptr + 1)
)时,它会尝试访问sentence
变量旁边的内存,然后将其视为另一个取消引用的指针。即使你很幸运并且sentence
在内存中恰好有一个有效的指针,连续的迭代也只会尝试取消引用越来越多的垃圾值作为指针。
当然,您可以通过printword
采取 achar *
并简单地传递sentence
给它来避免整个问题。
推荐阅读
- apache-nifi - 不同虚拟机上的 Apache NIFI SSL 集群。自动化问题(我猜)
- jquery-tageditor - tagEditor ,面对无法读取未定义错误的属性“maxTags”
- python-3.x - Python:尝试根据条件将值设置为 True 时的 SettingWithCopyWarning
- python - 'str' 对象没有属性 'get' Django 中间件
- wireshark - tshark:从数据包数据(内容)中捕获特定字节
- python-3.x - Pandas 指定在日期时间中使用哪些列
- javascript - 接下来如何修复错误不是角度的功能
- c# - 在wpf中绑定复选框列的特定复选框
- python - Pytest:收集错误,函数不使用参数“日期”
- html - 使用内联块和浮动创建 3 列布局有什么区别?