[英]Pointer of a struct with vector - Segmentation Fault
为什么我不能给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
字段不是向量,对吗? 那么,为什么会出现此错误?
指针仅存储内存地址。
struct_a *pointer;
这只是声明一个包含一些内存地址的变量。 在该内存地址处可能有一个struct_a
对象,也可能没有 。
那么如何知道pointer
是否pointer
实际对象呢? 您必须为指针分配一个内存地址。
您可以动态分配一个内存块来保存该对象,然后将该内存的地址分配给pointer
:
pointer = malloc(sizeof(struct_a));
或者,您可以在堆栈上分配对象,然后将该对象的内存地址存储在指针中:
struct_a foo;
pointer = &foo;
但是就目前而言,代码pointer
没有指向任何内容,而是使用->
运算符访问指针指向的内存。
在C语言中,您实际上可以做到这一点,但是却得到了不确定的行为。 像是分割错误。 或者可能只是怪异的行为。 一切皆有可能。
因此,在使用它之前,只需使指针指向某个东西即可。
pointer->qtd_lines = 10;
正在未分配的位置写入。 您需要初始化pointer
。
struct_a *pointer = malloc(struct_a);
在您的情况下,仅声明结构指针。 没有为此分配内存。
这样分配:
struct_a* pointer = (struct_a*)malloc(sizeof(struct_a));
同样,一旦完成您的工作,请不要忘记释放该内存,因为它是从堆内存段中获取的。
free(pointer);
希望能帮助到你。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.