我想前段时间我尝试了以下代码,一切都很顺利。但是现在,我有一个分段错误,我无法找出哪个部分提供了它。
#include <stdio.h>
#include <stdlib.h>
int main() {
char *test = NULL; // Empty string
char *a = "programming test";
int i = 0;
/* While the string "a" does not encounter a space,
I put its characters in the empty string "test" one by one. */
while(a[i] != ' ') {
test[i] = a[i];
i++;
}
printf("%sn", test);
return 0;
}
这个小代码对我来说似乎是正确的,我无法确定出了什么问题。
您在此处没有分配内存:
char *test = NULL; // Empty string
给它一些记忆:
char *test = malloc(sizeof(char) * 50);
循环后nul
终止它:
while(a[i] != ' ') {
test[i] = a[i];
i++;
}
test[i] = ' ';
printf("%sn", test);
你已经得到了问题的答案,但其他答案错过了告诉你的是,你的问题的答案
不明白为什么段错误
是由于代码产生的未定义行为。
在您的代码中,您已使用 NULL
初始化了test
。
char *test = NULL; // Empty string
稍后,如果不将内存分配给test
,您正在尝试取消引用相同的内存。
test[i] = a[i];
这会产生未定义的行为。
摘自C11
标准文档第6.5.3.2
章,地址和间接寻址运算符,第4段,
[...]如果 已为指针分配了无效值,则未定义一元 * 运算符的行为。
及相关脚注(102(
在一元 * 运算符取消引用指针的无效值中,有一个空指针,即 地址与指向的对象类型以及对象地址在 其生命周期结束。
众所周知,数组下标运算符[]
是unary *
运算符(*p
=== p[0]
realtion(的变体,该规则适用于相同的规则。
所以,基本上,这里你取消引用一个NULL
指针,创建未定义的行为。
请记住:>>分段错误是具有未定义行为的副作用之一。
若要解决此问题,应在取消引用指针之前将内存分配给指针。
此外,同样值得一提的是,字符串应始终以 null 结尾。
也就是说,您应该使用 int main(void)
作为函数签名。这是标准推荐的。
char * test=NULL;
未将任何内存分配给指针 test
。您正在引用NULL
所以它会导致分段错误。
因此,为test
分配内存。
test=malloc(50);// memory you need.