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

标签 c struct dynamic-memory-allocation

<分区>

Possible Duplicate:
C Array Instantiation - Stack or Heap Allocation?

当动态分配一个包含 char 指针的结构时,实际的 char 指针会发生什么?它存储在哪里?

一旦结构被释放,char 指针是否也随之释放?

例如考虑以下结构:

struct mix
{
    int a;
    float b;
    char *s;
};

typedef struct mix mix;

然后是下面为其分配内存的代码:

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;
}

*s 是否在堆栈上分配,然后与 *ptr 一起释放?我可以想象它确实是在堆栈上分配的,因为它不是以任何方式动态分配的(除非 malloc 具有我不知道的某些功能)。我猜想 *s 的“超出范围”将是在释放 *ptr 的时候。还是我完全错了? :)

非常感谢!

最佳答案

名为 schar* 成员的空间与 mix 的其余成员一起分配在堆上调用 malloc()(您不需要转换其返回值)。 s 所分配的字符串字面量并未分配在堆或堆栈上,而是实际二进制文件的一部分,并具有静态存储持续时间。所以这个:

ptr->s = "Hi, there, I'm just a really long string.";

将字符串文字的地址分配给ptr->s。如果你想让 ptr->s 指向字符串文字以外的东西,那么你需要为它分配 malloc() 内存。对于每个 malloc() 必须有一个 free() 所以 ptr->s 需要是 free()d before ptr is (if ptr->s is pointing to dynamically allocate memory only).

在调用 free() 之后,取消引用 ptr 是未定义的行为。

关于c - 动态分配的结构中的字符数组存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12951190/

相关文章:

c - C 中的动态内存分配,无需 malloc

c - Malloc 函数在运行时返回的最大大小是多少?

c++ - 使用 vbscript 部署 C++ 程序?

ios - AppDelegate 不访问更新的结构变量 - Swift

c - 使用 send 的结构内部的指针

java - JNA 通过引用在 C 结构中使用多个 void 指针

c - 内存分配错误

java - 代码复杂度

c - 如何定义一个字符串数组,分配与定义分开?

c - Unicode代码指向utf8和wctomb