C struct问题

时间:2009-11-23 15:27:17

标签: c pointers struct

我是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

3 个答案:

答案 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;
}