C警告:函数返回局部变量的地址

Fra*_*lea 5 c malloc pointers

下面的函数采用argv [0]参数,该参数包含应用程序的调用路径,并替换最后一位,直到它使用我想要生成的新应用程序的名称命名为"/",该应用程序位于同一文件夹中.

BTW:我正在声明一个全局argv变量,因此该函数可以访问它,因为我不想在每个函数调用中传递信息.

当我编译我的代码时,一切似乎都有效,但我收到了上述警告.

我知道我正在声明变量,并且只要函数返回它就会被销毁.

作为初学C程序员,我想知道解决这个问题的最优雅/最简单的方法是什么?

我应该将指针传递给函数或malloc一些内存吗?

char *returnFullPath()
{
    char pathToApp[strlen(argv[0])+1];
    strcpy(pathToApp, argv[0]);
    int path_length = strlen(argv[0]);

    while (pathToApp[path_length] != '/')
    {
        path_length--;
    }

    if (path_length > 2)
        pathToApp[path_length+1] = '\0';
    else
        pathToApp[0] = '\0';

    // length of getcwd + length of pathtoapp + 1 for zero plus 6 for "bidbot"
    char bidbotPath[strlen(getcwd(NULL,0)) + strlen(pathToApp) + 1 + 6];

    sprintf(bidbotPath, "%s/%sbidbot", getcwd(NULL,0), pathToApp);

    return bidbotPath;
}
Run Code Online (Sandbox Code Playgroud)

Moo*_*ice 47

其他一些答案表明你可以使用malloc并返回它.这与C++中的错误做法一样,当你在函数中新建一个东西并且调用者应该删除它(谁拥有所有权?)时

有许多C API的格式为:

function(buf, length);
Run Code Online (Sandbox Code Playgroud)

这意味着CALLER提供缓冲区以及它的持续时间.调用者负责分配和取消分配此缓冲区,并且您的函数应该使用它,并检查您是否不会超出该长度.

不要malloc并返回.这只是在寻找麻烦.

  • 当调用者无法知道要分配多大的缓冲区时,这个好建议就会失效. (5认同)
  • 许多C库和函数,包括POSIX,分配和返回正是David Heffernan给出的原因.更好的建议:"不要对调用约定做出假设.",与"使用内存调试器"配对. (3认同)