首页 > 解决方案 > 将结构成员指针分配给另一个动态内存分配的指针是否安全?

问题描述

#include <stdio.h>
#include <stdlib.h>

struct Test {
    const char *str;
};

void test_new(Test *test) {
    char *s = malloc(100);
    
    s[0] = 'H';
    s[1] = 'i';
    s[2] = '\0';
    
    test->str = s;
}

int main(void) {
    struct Test test;
    
    test_new(&test);
    
    puts(test.str);
    free(test.str);
    
    return 0;
}

这是允许的吗?将结构成员分配给函数中的局部变量(字符指针)test_new?(test->str = s允许吗?)

我听说数组变量在函数结束后被释放,它们是本地的。我想知道这是否适用于内存分配的局部变量。

像这样:

char *test(void) {
    char s[100];
    return s;
}

s将在函数结束时消失,所以我想知道这是否适用于我的结构,尤其是我没有返回,而是更改了一个成员。

将结构成员指针(即test->str)分配给另一个动态内存分配的指针(即s)是否安全?

标签: cpointersmemorystructscope

解决方案


test_new函数中让我们看看这两行:

// 1
char *s = malloc(100);

// 2
test->str = s;

1你有这样的事情之后:

+---+ +------------------+
| 小号 | --> | malloc 分配的内存... |
+---+ +------------------+

然后在2你有这样的事情之后:

+---+
| 小号 | ----------\
+---+ \ +-------------------+
                  >--> | malloc 分配的内存... |
+-----------+ / +-------------------+
| 测试->str | --/
+-----------+

然后一旦test_new返回,函数中只有这个main

+----------+ +-------------------+
| 测试.str | --> | malloc 分配的内存... |
+----------+ +-------------------+

这很好。


推荐阅读