Mik*_*ike 1 c c++ variables heap stack
这是一个简单的代码,其中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);
}
Run Code Online (Sandbox Code Playgroud)
编译日志:
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
Run Code Online (Sandbox Code Playgroud)
运行日志:
localStrPtr =
localIntPtr = 8
localCharPtr = y
Run Code Online (Sandbox Code Playgroud)
正如您在日志文件中看到的那样,localStrPtr返回"some garbage",而localIntPtr和localCharPtr返回"expected"值.
但是,在函数localStrPtr中,如果我更改-to- char str[20]> char* str = (char*) malloc (20),localStrPtr会正确返回字符串"abcd".一旦进行了上述更改,这是RUN LOG.
新运行日志:
localStrPtr = abcd
localIntPtr = 8
localCharPtr = y
Run Code Online (Sandbox Code Playgroud)
问题:
[1]在函数localIntPtr和localCharPtr中,返回的局部变量的内容地址为WORKED,但是对于函数localStrPtr,正确的值仅使用malloc 返回,但不会使用local char str [20].当使用局部变量char和int时,为什么它不能与str [20]一起使用?
[2]为什么我们在COMPILE LOG中看到所有3个函数的下面几行?
您无法从函数返回局部变量.局部变量存在于堆栈中,一旦函数完成,该堆栈空间就会被释放,并可供下一个函数调用使用.
如果使用malloc,它会在堆上分配内存.当函数结束时,不会释放此内存,因此您可以返回它,并且该内存仍然在调用函数的空间中分配(这也是为什么malloc可能导致内存泄漏,但本地数组不会).
这并不像看起来那么清晰,因为返回值总是按值传递.如果返回一个本地int,它将返回该int的值,并且它可以正常工作.如果返回一个本地数组,它将返回指向该数组的指针的值,如果该指针不再指向内存的有用部分,则该指针将无法正常运行.