我是C初学者,我很好奇为什么每次都会给我一个Seg Fault:
#include <stdio.h>
#include <stdlib.h>
struct Wrapper {
int value;
};
int main () {
struct Wrapper *test;
test->value = 5;
return 0;
}
我知道我还没有完全理解指针,但我认为
struct_ptr->field
与
相同(*struct_ptr).field
所以试着让一个正确的作业到现场应该没问题。这有点像预期的那样:
struct Wrapper test;
test.value = 5;
但我很好奇为什么使用指针导致Seg Fault。
我在Ubuntu 9.04(i486-linux-gnu),gcc版本4.4.1
答案 0 :(得分:12)
您没有将指针指定给任何东西。这是一个未初始化的指针,指向谁知道什么,所以结果是未定义的。
您可以将指针指定给动态创建的实例,如下所示:
int main () {
struct Wrapper *test;
test = (struct Wrapper *) malloc(sizeof(struct Wrapper));
test->value = 5;
free(test);
return 0;
}
编辑:意识到这是C,而不是C ++。相应地修复了代码示例。
答案 1 :(得分:1)
您需要先创建一个Wrapper实例:
struct Wrapper *test;
test = new struct Wrapper;
test->Value = 5;
祝你好运。
答案 2 :(得分:1)
您正在使用未初始化的指针,因此是段错误。
如果您使用-Wall
打开更多警告,可能会发现此类错误
您需要将-Wall与一些优化(-On)结合使用以显示警告。例如,使用
编译代码gcc -Wall -O2 -c test.c
导致以下错误消息:
test.c: Dans la fonction «main» :
test.c:10: attention : «test» is used uninitialized in this function
使用法语单词时,此编译器消息不是侮辱,而是警告;) 请参阅下面的代码,为测试指针分配内存
int main () {
struct Wrapper *test;
test = malloc(sizeof(struct Wrapper))
if(test == NULL) {
/* error handling */
}
test->value = 5;
free(test)
return 0;
}