微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将结构成员指针分配给另一个动态内存分配的指针是否安全?

如何解决将结构成员指针分配给另一个动态内存分配的指针是否安全?

#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)是否安全?

解决方法

通过test_new函数,让我们看一下这两行:

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

// 2
test->str = s;

1之后,您会看到以下内容:

+---+     +-------------------------------+
| s | --> | memory allocated by malloc... |
+---+     +-------------------------------+

然后在2之后,您将看到以下内容:

+---+
| s | ----------\
+---+            \     +-------------------------------+
                  >--> | memory allocated by malloc... |
+-----------+    /     +-------------------------------+
| test->str | --/
+-----------+

然后test_new返回时,您在main函数中只有这个:

+----------+     +-------------------------------+
| test.str | --> | memory allocated by malloc... |
+----------+     +-------------------------------+

这很好。

,

在您的test_new函数中完成的分配/分配是允许的,并且是安全的。这是因为char *s = malloc(100);行在堆(而不是'local'堆栈)上分配内存,而test->str = s;行将指向已分配内存的指针分配给通过引用传递的结构的成员。因此,将按您的意愿修改调用代码的结构变量中的该成员。

出了什么问题(使用第二个片段中的本地内存作为示例),就像这样:

void test_bad(Test *test) {
    char s[100]; // Local memory - gone when function returns
    s[0] = 'H';
    s[1] = 'i';
    s[2] = '\0';    
    test->str = s; // Pointer member of structure will be invalid after the return.
}

上面的 bad 代码将进行编译(在语法上正确是正确的),但是任何不错的编译器都会(或应该)警告您有关使用指向局部变量的指针。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。