C语言中字符串打印时的分段错误

时间:2018-06-17 21:52:03

标签: c memory segmentation-fault

我正在进行一项任务,当我尝试打印字符串的各个字符时,发现我遇到了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个字符是我的限制。我不明白为什么这是一个问题,因为我只是打印。

2 个答案:

答案 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])

我希望这会有所帮助!!!!