C 指向结构中指针的指针
有人能解释一下为什么我的这部分代码不起作用吗C 指向结构中指针的指针,c,pointers,struct,C,Pointers,Struct,有人能解释一下为什么我的这部分代码不起作用吗 typedef struct { char *something; } random; random *rd; rd->something = calloc(40, sizeof(char)); // This is the line which crashes strncpy(rd->something, aChar, 40); 如果我这样编写程序,则该程序可以工作: random rd; rd.something = ca
typedef struct {
char *something;
} random;
random *rd;
rd->something = calloc(40, sizeof(char)); // This is the line which crashes
strncpy(rd->something, aChar, 40);
如果我这样编写程序,则该程序可以工作:
random rd;
rd.something = calloc(40, sizeof(char));
strncpy(rd.something, aChar, 40);
但我认为在处理内存时这是错误的,这就是为什么我需要第一个场景的帮助。这是因为您定义了指针
random *rd;
未正确初始化,因此会出现分段错误。第二个版本可以工作,因为您实际上分配了rd
。要使第一个版本也能工作,请使用为*rd
分配内存
random *rd = (random*)malloc(sizeof(random));
案例1:
random *rd;
// Create *pointer* to struct of type random . Doesn't point to anything.
rd->something = calloc(40, sizeof(char));
// Use it by trying to acquire something which doesnt exist and it crashes
案例2:
random rd;
// Create a random struct
rd.something = calloc(40, sizeof(char));
// Use it . Works good
===========================
对于案例1,您需要首先分配一个结构,使指针指向它,然后使用
->
操作符修改值没有为rd所指的结构分配内存
尝试:
它将工作,但首先将内存分配给rd。
rd=(随机*)calloc(1,sizeof(随机)) 第二种方法是正确的。您也可以修复第一个,但您可能不需要它。
random*rd代码>,rd
未初始化。需求rd=malloc(sizeof(random))代码>或rd=&random_obj代码>在第一种方法中,首先需要为rd分配内存,然后为某些内容分配内存。那就好了。在第二种情况下,您将内存分配给堆栈上的rd,所以不需要为结构分配内存,并且需要为您正在做的事情分配一次内存,因此它可以工作。希望这能回答你的问题。第二个没有问题(它比第一个好),只要你不需要对象持续超出它的范围。顺便说一下,sizeof(char)
是1。它不是初始化为NULL
——除非它是一个全局变量。你确定吗?我认为,random*rd
初始化为某个垃圾值。在第一种情况下,如果您首先为rd分配堆内存,它会起作用。最好不要将强制转换添加到malloc函数中
typedef struct {
char *something;
} random;
random *rd = malloc (sizeof(random));
rd->something = calloc(40, sizeof(char)); // This is the line which crashes
strncpy(rd->something, aChar, 40);