存储动态分配的结构中的字符数组在哪里?

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.或者我完全错了?:)

非常感谢!

hmj*_*mjd 6

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是未定义的行为.