[英]Segmentation Fault when Printing Characters in String in C
我正在分配作业,当我尝试打印字符串的各个字符时,发现我遇到了段错误。 这很奇怪,因为删除打印语句时没有分段错误。
我简化了分配工作的那部分,从而以更简单的代码给了我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”。 看来我可以从字符串中打印任何字符,但是,在出现段错误之前,我只能限制一个字符。 我不明白为什么这是个问题,因为我只是在打印。
这是一个优先问题。 *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
取一个char *
并简单地将sentence
传递给它来避免整个问题。
典型的新C程序员会犯错误,认为*str[i]
与str[][i]
相同,不是* str[i][0]
。
那么,为什么会这样呢? 当您查看优先级时, []
位于顶部。 看看这个
另一种查看方式是:
arr[i][j]
是这样的:
*(*(arr+i) + j)
因此*str[i]
就像:
**(arr + i)
您想要的是:
*(*(arr) + i)
就像:
*(arr[i])
我希望这有帮助!!!!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.