结构体变量与结构体指针的内存分配差异及指针指向问题
结构体变量与结构体指针的内存分配差异及相关问题解答
先看两段示例代码:
示例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
相关产品推荐
相关产品推荐

