由于变量'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;
}
答案 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 = 0
,j = 0
和b = 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()
和函数族来完成内存分配。