带向量的结构的指针 - 分段错误

时间:2015-03-18 03:49:45

标签: c pointers vector struct

为什么我无法为qtd_lines分配值?

typedef struct{
  int x;
  int y;
  char z;
}struct_c;

typedef struct{
   int qtd_lines;
   struct_c *vector;
}struct_a;

int main(){
 struct_a *pointer;

//This gives me Segmentation Fault.
 pointer->qtd_lines = 10;
 pointer->vetor = (struct_c *)  malloc(pointer->qtd_lines * sizeof(struct_contas));

 return 0;
}

好的,我的struct_c中有一个向量,但字段qtd_lines不是向量,对吧?那我为什么会收到这个错误?

3 个答案:

答案 0 :(得分:2)

指针存储内存地址

struct_a *pointer;

这只是声明一个包含一些内存地址的变量。在该内存地址,可能struct_a对象,或者

那你怎么知道pointer是否指向一个实际的对象?您必须为指针分配一个内存地址。


您可以动态分配一块内存来保存对象,并将该内存的地址分配给pointer

pointer = malloc(sizeof(struct_a));

或者您可以在堆栈上分配对象,然后将该对象的内存地址存储在指针中:

struct_a foo;
pointer = &foo;

但是就目前而言,代码中pointer并未指向任何内容,而是使用->运算符来访问指针指向的内存。

在C中你实际上可以这样做,但是你会得到未定义的行为。像分段错误。或者可能只是奇怪的行为。一切皆有可能。

因此,在使用之前,只需使指针指向某个东西。

答案 1 :(得分:1)

pointer->qtd_lines = 10;正在未分配的位置写作。您需要初始化pointer

 struct_a *pointer = malloc(struct_a);

答案 2 :(得分:0)

在您的情况下,仅声明结构指针。没有为此分配内存。

像这样分配:

struct_a* pointer = (struct_a*)malloc(sizeof(struct_a));

此外,一旦你完成了你的事情,请不要忘记释放内存,因为它是从堆内存段中取出的。

free(pointer);

希望它有所帮助。