【问题标题】:Segmentation Fault(core dumped) when an int variable is initialized初始化 int 变量时出现分段错误(核心转储)
【发布时间】:2015-06-26 12:51:21
【问题描述】:

由于初始化变量“b”而出现分段错误。有人请帮我解决这个问题。

#include "stdio.h"
#include "string.h"

int main(){
    char *z[20], *x, *y = {"abcd"};
    int i, j, b = 4;
    for (i = 0 ; i < 4 ; i++) {
         for (j = 0 ; j < b ; j++) {
             *(x + j) = *(y + j + i);
             z[i] = x;
             printf("%s", z[i]);
             printf("\n");
         }
         b--;
    }
    return 0;
}

【问题讨论】:

  • 诚实的问题?为什么这样的问题被否决了?

标签: c arrays pointers segmentation-fault initialization


【解决方案1】:

你取消引用x,它没有在任何地方初始化,因此是一个无效的指针

*(x + j) = *(y + j + i);

可能的解决方案:

  • x声明为数组,如

    char x[5];
    

    并且,nul 在打印之前终止它,比如

    x[j]     = y[i + j];
    x[1 + j] = '\0';
    

还有一点,如果您应用我建议的解决方案,每个初始化的 z[i] 都将指向相同的数据,即指向数组 x

【讨论】:

    【解决方案2】:

    您已经从Iharob 先生那里得到了answer 来回答您的问题,只是为了详细说明一下,我想添加我的。

    在你的问题中,你提到像

    ...当 int 变量被初始化时

    这个说法是错误的。 int 变量初始化(i = 0j = 0b = 4)没有问题。这里的问题是 x 的不当使用。

    在您的代码中,x 的类型为 char *,即,它是指向 char 的指针。现在,通过说

     *(x + j) = <some value>
    

    您正在尝试x(或者,通常是x + j指向的char 分配一个值。好吧,但是等等,等等,x(或者,x + j)目前到底指的是什么?

    答案:x 本身没有显式初始化,因此它没有指向任何可以写入值的有效内存。标准指定,尝试读取或写入未初始化的内存位置调用undefined behaviour。分段错误是 UB 的副作用之一。

    为避免,您需要先为x 分配内存(使其指向有效的内存位置),然后将值放入它指向的内存位置。您可以使用malloc() 和一系列函数来完成内存分配。

    【讨论】:

    • 我相当怀疑OP可能认为x指向字符串abcd开头的内存地址,所以这是一个有用的答案。
    • @JRichardSnape 谢谢。很高兴你发现它很有用。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多