Nob*_*lis 2 c struct dynamic-memory-allocation
可能重复:
C阵列实例化 - 堆栈还是堆分配?
当动态分配包含char指针的struct时,实际的char指针会发生什么?它存放在哪里?
一旦结构被释放,char指针是否随之释放?
例如,考虑以下结构:
struct mix
{
int a;
float b;
char *s;
};
typedef struct mix mix;
Run Code Online (Sandbox Code Playgroud)
然后是以下代码为它分配内存:
int main()
{
mix *ptr = (mix*)malloc(sizeof(mix));
ptr->a = 3;
ptr->b = 4.5f;
ptr->s = "Hi, there, I'm just a really long string.";
free(ptr);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
被*s分配在堆栈上,然后用中解脱出来一起*ptr?我可以想象它确实是在堆栈上分配的,因为它没有以任何方式动态分配(除非malloc具有一些我不知道的功能).而且我认为"超出范围" *s将会解放*ptr.或者我完全错了?:)
非常感谢!
char*名为member 的空间s在堆上分配,并mix在调用之后与其余成员一起分配malloc()(其返回值不需要转换).s分配给的字符串文字不在堆或堆栈上分配,而是实际二进制文件的一部分,并具有静态存储持续时间.所以这:
ptr->s = "Hi, there, I'm just a really long string.";
Run Code Online (Sandbox Code Playgroud)
将字符串文字的地址分配给ptr->s.如果你想ptr->s指向字符串文字以外的东西,那么你需要malloc()为它记忆.并且对于每一个malloc()必须有一个free()所以ptr->s需要在free()之前ptr是(如果ptr->s指向仅动态分配内存).
调用之后free(),解除引用ptr是未定义的行为.