我正在进行一项任务,当我尝试打印字符串的各个字符时,发现我遇到了Seg Fault。这很奇怪,因为删除print语句时没有分段错误。
我简化了分配给我一个简单代码中的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 );
}
当我运行此代码时,只打印第一个字母,然后紧接着&#39;?&#39;其次是“分段错误:11&#39;”。我似乎可以打印字符串中的任何字符,但是,在seg故障之前,只有1个字符是我的限制。我不明白为什么这是一个问题,因为我只是打印。
答案 0 :(得分:3)
这是一个优先问题。 *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
传递给它来避免整个问题。
答案 1 :(得分:1)
典型的新C程序员错误,认为*str[i]
与str[][i]
相同,而不是更像str[i][0]
。
那么,为什么会这样呢?当您查看优先级[]
位于顶部时。看看this
另一种看待它的方式是:
arr[i][j]
是这样的:
*(*(arr+i) + j)
因此*str[i]
就像:
**(arr + i)
你想要的是:
*(*(arr) + i)
就像:
*(arr[i])
我希望这会有所帮助!!!!