初始化int变量时的分段错误(核心转储)

时间:2015-06-26 12:51:21

标签: c arrays pointers segmentation-fault initialization

由于变量'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;
}

2 个答案:

答案 0 :(得分:5)

您取消引用x未在任何地方初始化,因此是无效指针

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

可能的解决方案:

  • x声明为数组,例如

    char x[5];
    

    和,nul在打印前终止它,如

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

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

答案 1 :(得分:3)

你已经从answer先生那里得到了Iharob来提问你的问题,只是为了详细说明,我想加入我的。

在你的问题中,你提到了

  

...初始化int变量时

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

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

 *(x + j) = <some value>

尝试char x分配值x + j(或者更确切地说x指向< / em>的。好的,但是等等,等等,x + j(或x)目前实际指向的是什么?

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

为避免这种情况,您需要先将内存分配给color c7&pause&color (使其指向有效的内存位置),然后将值放入指向的内存位置。您可以使用malloc()和函数族来完成内存分配。