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

结构体变量与结构体指针的内存分配差异及指针指向问题

结构体变量与结构体指针的内存分配差异及相关问题解答

先看两段示例代码:

示例1:结构体变量s的代码

#include<stdio.h>
#include<stdlib.h>
#define SIZE 80

int main(void)
{
    struct stack
    {
        int size;
        int top;
        int *arr;
    }s;
    s.size=SIZE;
    s.top=-1;
    s.arr=malloc(s.size*sizeof(int));
    
    return 0;
}    

示例2:结构体指针*s的代码

#include<stdio.h>
#include<stdlib.h>
#define SIZE 80

int main(void)
{
    struct stack
    {
        int size;
        int top;
        int *arr;
    }*s;
    s->size=SIZE;
    s->top=-1;
    s->arr=malloc(s->size*sizeof(int));
    
    return 0;
}    

一、结构体变量与结构体指针的内存分配差异

  • 结构体变量(示例1的s):
    定义时直接在栈上分配了一整块对应struct stack大小的内存,包含size、top、arr三个成员的存储空间。可以直接用.运算符访问成员,后续给arr调用malloc分配的是堆内存,这部分内存和结构体变量本身的栈内存完全分开。
  • 结构体指针(示例2的s):
    它本身只是栈上的一个指针变量(大小由系统位数决定,32位占4字节,64位占8字节),但它指向的结构体实例根本没分配内存。代码里直接用s->访问成员是严重错误的,因为指针没指向任何有效的结构体内存。如果要正常使用,得先给指针分配结构体实例的内存,比如s = malloc(sizeof(struct stack));,这时结构体实例才会在堆上被创建。

二、示例2中结构体指针s指向何处?

这个s是未初始化的局部指针,它的值是内存里的随机垃圾值,指向的地址完全不确定——可能是无效内存,也可能是其他变量的内存。直接通过它操作成员属于未定义行为,十有八九会导致程序崩溃或者乱改其他数据。

三、结构体定义、指针变量的内存说明

  • 结构体的类型定义(struct stack {...})只是告诉编译器这个结构体的成员布局和大小,本身确实不占用任何内存,只有当你实例化结构体变量或者给指针分配结构体实例内存时,才会真正占用内存。
  • 结构体指针变量s本身是存在内存地址的:它作为局部变量在栈上有自己的存储空间,你可以用&s获取它的地址,但它存储的指向目标的地址是未初始化的垃圾值,和结构体类型有没有实例化没关系——指针变量自己的内存是肯定存在的,只是它没指向合法的结构体实例。

内容的提问来源于stack exchange,提问作者AkumaGreyy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 08:09:16