我可以对局部变量使用“ malloc”来返回局部变量吗?

Yun*_*ang 2 c

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

char * upperCase(const char* s)
{
    char * ret = NULL;
    size_t length = strlen(s) + 1;
    ret = (char*)malloc(sizeof(char) * length);
    for (size_t i = 0; i < length; i++) {
        ret[i] = toupper(s[i]);
    }
    return ret;
}

int main()
{
    char* ret = NULL;
    char* input = "HelloWorld";
    ret = upperCase(input);
    printf("value = %s", ret);
    free(ret);
}
Run Code Online (Sandbox Code Playgroud)

上面的代码将字符串作为参数并复制该字符串。然后,它将复制的字符串的每个元素转换为大写并返回。

编译器= GCC 6.2

如果使用malloc函数,是否可以返回局部变量以终止该函数并释放内存?我对仍然具有内存的范围没有足够的了解。

CIs*_*ies 5

简短回答:是的,有可能

长答案malloc(some_size)分配some_size空间并返回一个指向分配的块的开始地址的指针(或NULL失败时)。在执行ret = (char*)malloc(sizeof(char) * length);ret时,分配了指向length chars的内存块的指针(请注意,sizeof(char) == 1这样可以将其删除)。

直到释放函数后upperCase(...),内存才归您所有,即使在函数返回后也是如此,因此,在执行结束后,该内存仍属于您。唯一的问题是,指针ret被分配在堆栈上(auto)的本地存储,这意味着将“死”时,它的范围(在你的情况-该upperCase(...)功能的范围内),因此,你不会知道内存是,因为你ret从函数返回,它所保存的值(这是分配给内存的地址)将传递给mainret,这基本上意味着您很高兴。

我想强调的最后一件事是,始终会返回局部变量。例如int increment_by_one(int x){int y = x + 1; return y;}。这是一个非常简单的函数,它返回local的值int y。由于返回的值就是我们所需要的(即的值x+1),因此可以将其(值)存储在局部变量中。对于您的情况也是如此(因为)ret内部upperCase保存分配的地址,结束后可以“死亡”upperCase,因为它所保存的值(地址)被传递了。

char * upperCase(const char* s)
{
    char * ret = NULL;                             // local variable -> will die after upperCase ends
    size_t length = strlen(s) + 1;                 // local variable -> will die after upperCase ends
    ret = (char*)malloc(sizeof(char) * length);    // ret assigned with address to memory
    for (size_t i = 0; i < length; i++) {          // local variable -> will die after it's scope (the for loop) ends
        ret[i] = toupper(s[i]);
    }
    return ret;                                     // said address is returned to main (local variable ret now dies peacefully after fulfilling its duty) 
}

int main()
{
    char* ret = NULL;               // local variable -> will die after main ends
    char* input = "HelloWorld";     // local variable -> will die after main ends
    ret = upperCase(input);         // ret gets the address allocated in upperCase
    printf("value = %s", ret);
    free(ret);                      // address is freed
}
Run Code Online (Sandbox Code Playgroud)

2个注意事项:

  1. 不需要强制转换malloc返回值,这ret = (char*)malloc(sizeof(char) * length);应该是ret = malloc(sizeof(char) * length);
  2. 不需要,sizeof(char)因为它是1,这意味着您可以将其进一步缩短为ret = malloc(length);
  3. malloc会失败。在这种情况下,它将返回NULL所以以后每隔ret = malloc(...);你应该检查,如值if(!ret){// handle error}if(ret != NULL){// do something}与此类

  • 是的,它看起来像是原始问题的复制/粘贴问题,但始终值得清理,因此将由OP或可能跟随的许多人进行学习; (2认同)