从函数返回“本地”字符*与从函数返回“本地”int*之间的区别[重复]

Posted

技术标签:

【中文标题】从函数返回“本地”字符*与从函数返回“本地”int*之间的区别[重复]【英文标题】:Difference between - returning a 'local' char* from a function vs returning a 'local' int* from a function [duplicate] 【发布时间】:2012-12-22 23:03:36 【问题描述】:

可能重复:Can a local variable’s memory be accessed outside its scope?

这是一个简单的代码,其中在 3 个不同的函数 [ localStrPtr, localIntPtr, localCharPtr] 中返回一个指向它们的局部变量 [string, integer, char] 的指针各自的功能。

代码:

#include <stdio.h>

char*  localStrPtr (char*);
int*   localIntPtr (int, int);
char*  localCharPtr (char);

main()

    int *pInt;
    char *pChar;

    printf( "localStrPtr = %s\n", localStrPtr("abcd") );

    pInt = (int*) localIntPtr(3, 5);
    printf( "localIntPtr = %d\n", *pInt );

    pChar = (char*) localCharPtr('y');
    printf( "localCharPtr = %c\n", *pChar );


char* localStrPtr(char* argu)

    char str[20];
    // char* str = (char*) malloc (20);

    strcpy (str, argu);
    return str;


int* localIntPtr (int argu1, int argu2)

    int local;
    local = argu1 + argu2;
    return (&local);


char* localCharPtr (char argu)

    char local;
    local = argu;
    return (&local);

编译日志:

stringManip.c: In function `localStrPtr':
stringManip.c:27: warning: function returns address of local variable
stringManip.c: In function `localIntPtr':
stringManip.c:34: warning: function returns address of local variable
stringManip.c: In function `localCharPtr':
stringManip.c:41: warning: function returns address of local variable

运行日志:

localStrPtr =
localIntPtr = 8
localCharPtr = y

正如您在日志文件中看到的,localStrPtr 返回“一些垃圾”,而 localIntPtr 和 localCharPtr 返回“预期”值。

但是,在函数 localStrPtr 中,如果我更改 [ "char str[20]" -to-> "char* str = (char* ) malloc (20)" ],localStrPtr 正确返回字符串“abcd”。这是运行日志,一旦进行了上述更改。

新的运行日志:

localStrPtr = abcd
localIntPtr = 8
localCharPtr = y

问题:

    在函数 localIntPtr 和 localCharPtr 中,返回的局部变量地址的内容 WORKED,但对于函数 localStrPtr,正确的值返回 "only" 与 malloc,但不会与 local char字符串 [20]。为什么它不适用于 str[20] ?

    为什么我们在 COMPILE LOG 中看到以下所有 3 个函数的行?

    stringManip.c:27: 警告:函数返回局部变量的地址 stringManip.c:34: 警告:函数返回局部变量的地址 stringManip.c:41:警告:函数返回局部变量的地址

【问题讨论】:

从不返回指向存储类为 auto 的数据的指针。 从不(或者 Kernigham 离开他的坟墓并杀了你) 现在有代码了!但是有什么问题吗...? 抱歉各位在我完成问题之前回答。 *** 和 Chrome 似乎有问题。来自 Unix 的剪切和粘贴似乎不能在 1 件中工作。我应该一点一点地做,节省小块。在我保存和添加时,人们已经回复了一个不完整的帖子 【参考方案1】:

未定义的行为,在所有 3 种情况下。该“未定义”包括它可能起作用的可能性。或者看起来它正在工作。有时。

您正在返回一个指向局部变量的指针,该变量在堆栈上分配。当该变量超出范围时,该内存不再保留给该变量,这将是函数返回时。内容是否被改变,以及何时发生,都取决于运气。正如你的情况一样,你很幸运有几个案例,但不是另一个。在不同的日子里,编译器可能在内部做出了一些不同的选择,它的行为也不同。或者也许(可能)下次打喷嚏时数据会被覆盖。

别这样。

【讨论】:

也许这是一个危险的实现示例会很好。就像堆栈分配的存储、堆栈上的参数(无论方向)、被调用者清理。

以上是关于从函数返回“本地”字符*与从函数返回“本地”int*之间的区别[重复]的主要内容,如果未能解决你的问题,请参考以下文章

JVM函数调用与从本机方法返回的性能?

为具有 C++ 字符串返回值的函数返回本地 C 字符串

从函数返回字符串 [char 指针] [重复]

程序结构之返回指针的函数

使用 Environment.ExitCode 与从 Main 返回 int

返回函数本地的 std::string 的最佳方法