首页 > 解决方案 > 在 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 个字符是我在段错误之前的限制。我不明白为什么这是一个问题,因为我只是在打印。

标签: cmemorysegmentation-fault

解决方案


这是一个优先问题。*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给它来避免整个问题。


推荐阅读