【问题标题】:Why there's no need to allocate a memory space to store pointer returned from function?为什么不需要分配内存空间来存储函数返回的指针?
【发布时间】:2020-12-10 13:27:25
【问题描述】:
#include <stdlib.h>
#include <stdio.h>

char* get_string(){
//    char* pointer = malloc(sizeof(char)*10);
    char* pointer = "string";
    printf("%s\n",pointer);
    return pointer;
}

int main(){
//    char* got = malloc(sizeof(char)*10);
    char* got = get_string();
    printf("%s\n",got);
//    free(got);
}

这段代码在测试中没有给出警告。 但我的问题是: 对于以下几行代码,

    char* got = malloc(sizeof(char)*10);
    got = get_string();

为什么这里不需要malloc? 为什么不需要分配内存来存储函数返回的指针? 我现在有点困惑。 谢谢。

【问题讨论】:

  • char* pointer = "string"; 已经为pointer 分配了内存,而pointer 指向只读内容,可以返回并传递,但不能修改其内容
  • 您确实有存储指针的位置。变量got 在堆栈上有足够的空间来存储一个指针。它与int x = 5 没有什么不同,其中提供了空间来存储整数。
  • 请注意,char *got = malloc(...); got = get_string() 是内存泄漏,因为您丢失了 malloc 返回的值。就像int x = 5; x = 7 一样,5 丢失了。
  • 请注意复制字符串(strcpy() 等)和分配指针之间的区别。你不能直接分配数组。

标签: c pointers dynamic-memory-allocation


【解决方案1】:

举个例子:

int a = 5;
a =6;

现在,5 的值丢失了。 你的情况也一样。 malloc() 返回并存储到got 中的指针将被函数调用get_string() 返回的指针覆盖。所以会有内存泄漏。

请记住,您正在为一个变量(指针类型)赋值,并且对于该变量got,内存已经分配。您需要确保got 的值,即got 持有的地址指向一个有效的内存位置,然后才能读取/写入/写入该位置。

【讨论】:

    【解决方案2】:

    在 C 中

    const char* my_str = "my str";
    

    creates 在全局静态内存中创建一个字符串“my str”,并在堆栈上创建一个指向该内存的指针。由于“my str”在进程的整个生命周期中都存在,因此返回指向它的指针是安全的。但是,如果你这样做了:

    const char my_str[] = "my str";
    return my_str;
    

    您将遇到未定义(不良)的行为。这是因为后一种情况在函数的堆栈上分配“my str”,一旦函数返回,“my str”就会从堆栈中弹出。返回的任何指针都将指向垃圾。

    在 C++ 中,您只能将字符串文字分配给 const char*。 C 允许您将字符串文字分配给 char*,但我认为写入取消引用的指针不是一个好主意。

    【讨论】:

      【解决方案3】:

      将指针视为存储地址类型值的变量

      ma​​lloc 是一个函数,它返回内存中可以存储作为参数传递的所需大小的位置的地址

      一旦变量超出范围(当您到达关闭该变量声明之前的第一个“{”的“}”时)您将无法访问它们,它们在内存中的位置将失效。

      ma​​lloc 所做的是保持内存中的那个位置有效,直到你用 free 释放它。

      因此,如果您已经调用了 malloc 并想要更新指针,您所要做的就是将该值(地址)分配给指针。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-02
        • 2010-09-30
        • 2017-10-03
        • 2021-03-11
        • 1970-01-01
        • 2019-07-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多