下面的函数采用包含应用程序调用路径的 argv[0] 参数,并替换最后一位,直到它遇到一个“/”,其中包含我要生成的位于同一文件夹中的新应用程序的名称.
顺便说一句:我正在声明一个全局 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;
}
最佳答案
其他一些答案建议您 malloc 一些东西并返回它。这与在 C++ 中的意义相同,这是一种不好的做法,当您在函数中新建某些内容并且调用者应该将其删除(谁拥有所有权?)
许多 C API 具有以下格式是有原因的:
function(buf, length);
这意味着 CALLER 提供缓冲区及其长度。分配和取消分配此缓冲区是调用者的责任,您的函数应该使用它,并检查您是否不会溢出长度。
不要 malloc 和 return。这只是自找麻烦。
关于C 警告 : Function returns address of local variable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6897914/