C语言中能否直接为结构体变量(含结构体指针变量)赋值?
C语言结构体变量与指针赋值的常见问题解答
结构体指针变量赋值完全合法
你代码里的top = p操作是完全没问题的。top和p都是struct stack*类型的指针,指针的本质就是存储内存地址,赋值操作就是把p指向的内存地址拷贝给top,让top也指向同一块堆内存区域——这是C语言指针的基础操作,和int a = b这种普通变量赋值逻辑完全一致。
普通结构体变量也支持直接赋值
不光指针,普通结构体变量同样可以直接赋值,比如:
struct stack a, b; a.no = 5; a.prev = NULL; b = a; // 直接将a的所有成员值拷贝给b
这种赋值会逐成员复制结构体里的全部数据,效果和手动给每个成员赋值一样。C99及之后的标准都支持这个特性,哪怕结构体里包含指针成员,也只会拷贝指针本身的地址(也就是浅拷贝,不会复制指针指向的内容)。
对你代码的一处修正
你代码里malloc的强制类型转换有误:
p = (int *)malloc(sizeof(struct stack));
正确写法应该是:
// 方式1:匹配结构体指针类型 p = (st *)malloc(sizeof(st)); // 方式2:更安全,避免类型写错 p = malloc(sizeof(*p));
malloc返回的是void*类型,在C语言里可以直接赋值给其他指针类型,强制转换不是必须的;如果一定要加转换,也得转成对应结构体指针类型st*,而不是int*,否则会引发类型不匹配的隐患。
内容的提问来源于stack exchange,提问作者Nishu Patel
相关产品推荐
相关产品推荐

