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);