C 当动态内存分配显式转换为结构类型时,会发生什么情况?

C 当动态内存分配显式转换为结构类型时,会发生什么情况?,c,C,我已经开始学习链表的概念。我遇到了一些代码。如果有人解释一下下面的代码会发生什么,那将非常有帮助。我试过搜索,但找不到合适的答案 struct node *new1; new1 = (struct node*)malloc(sizeof(struct node)); 这将分配一个局部变量,可能在堆栈上,类型为“指向结构节点的指针” 这将分配一个适当对齐的内存块,其大小足以容纳可能来自堆的struct节点,并将new1设置为指向新分配的块。块将保持分配状态,直到进程终止或块被释放。不需要强制

我已经开始学习链表的概念。我遇到了一些代码。如果有人解释一下下面的代码会发生什么,那将非常有帮助。我试过搜索,但找不到合适的答案

 struct node *new1;
 new1 = (struct node*)malloc(sizeof(struct node));
这将分配一个局部变量,可能在堆栈上,类型为“指向结构节点的指针”


这将分配一个适当对齐的内存块,其大小足以容纳可能来自堆的
struct节点
,并将
new1
设置为指向新分配的块。块将保持分配状态,直到进程终止或块被释放。不需要强制转换。
malloc
返回的内存最初没有类型。当指针用于写入该内存时,该内存(最大为给定类型的大小)将成为一个对象,其类型为被解除引用的指针的类型。

@Allan不会发生任何事情。:)在C中,此语句new1=(struct node*)malloc(sizeof(struct node));等价于new1=malloc(sizeof(struct node));不太确定这里要问什么。缓冲区中没有任何更改,您只是将new1指向其中的任何垃圾。在C中,指针的转换总是在编译时执行。它所做的只是告诉编译器“我知道这是类型A,但我希望它是类型B。不要干涉,我知道我在做什么!”最后强调的部分对于所有转换都非常重要。但是指针类型转换正如您所描述的,它只描述了意图。对。这是偏好的问题。就个人而言,我更喜欢它,因为它使代码更容易地移植到C++,并且它更容易捕捉到分配的字节数和指针的使用之间的不匹配。但我是少数。@DavidSchwartz“这让事情变得更容易…”-有一个客观上更好的方法来避免这种不匹配,我相信你已经意识到了,为什么不提呢<代码>结构节点*new1=malloc(sizeof*new1)@KonradRudolph这是个人喜好。我发现这一点可读性要差得多。当我查看
sizeof
的参数时,我想知道的是类型,当我被指示到其他地方去弄清楚它时,我发现它非常烦人和令人分心。它并不总是在同一条线上,即使是在同一条线上,被迫重新扫描也是令人不快的。这种不匹配现在更容易检测,但代价是代码可读性降低。@DavidSchwartz这是更少(=一点也不)的偏好和更多的习惯。需要明确的是,区别在于“偏好”通常被用来假装某些东西是主观的,而实际上不是主观的。您可能不习惯这个习惯用法,但毫无疑问,它将所需信息封装得更简洁、更清晰,并且不太会让人分心。高智商的程序员竟然提出这样的观点,真是可笑。举个例子,你不会被迫“重新扫描”任何东西;这纯粹是事后的合理化。
struct node *new1;
new1 = (struct node*)malloc(sizeof(struct node));