【问题标题】:Segmentation Fault when Printing Characters in String in C在 C 中打印字符串中的字符时出现分段错误
【发布时间】:2018-11-26 18:50:48
【问题描述】:

我正在处理一项作业,并注意到我在尝试打印字符串的单个字符时遇到了 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 个字符是我的限制。我不明白为什么这是一个问题,因为我只是在打印。

【问题讨论】:

  • 您传递char** 是否有原因?
  • 如果对运算符优先级有疑问,请使用更多()
  • 记住这一点:在C 中将字符串更改为另一个字符串时,访问时传递的是单指针。只是侧面没有。
  • @Gox 为什么要传递双指针来编辑字符串? strcpystrtokstrcat 等不要那样做。
  • @melpomene 抱歉措辞错误,我的意思是用另一个不改变单个字符的字符串交换字符串。

标签: c memory segmentation-fault


【解决方案1】:

典型的新C程序员错误,认为*str[i]str[][i]相同,不是更像str[i][0]

那么,为什么会这样呢?当您查看优先级时,[] 位于顶部。看看this

另一种看待它的方式是:

arr[i][j]

是这样的:

*(*(arr+i) + j)

因此*str[i] 就像:

**(arr + i)

你想要的是:

*(*(arr) + i)

就像:

*(arr[i])

希望对你有帮助!!!!

【讨论】:

  • str[i][0] 实际上与*str[i] 完全相同,这就是索引运算符的定义方式(加上将0 添加到有效指针使其保持不变的事实)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 2016-02-13
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多