You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 20:21:03