func1 给出警告和垃圾值,而 func2 给出正确的输出。两者有什么区别?
//func 1
unsigned char *CreateData()
{
unsigned char data[]="Thanks";
return data;
}
/* func 2
unsigned char *CreateData()
{
unsigned char *data=malloc(6);
strncpy(data,"Thanks",strlen("Thanks"));
return data;
}
int main()
{
unsigned char *a;
a=CreateData();
printf("%s",a);
return 0;
}
谢谢 :)
最佳答案
使用 CreateData
的第一个实现,您返回一个指向具有自动存储持续时间的变量的指针,然后在其生命周期结束后使用它,这是未定义的行为。
不太正式,实际发生的是 data
分配在堆栈上,一旦你开始使用它作为 a
, CreateData
已经结束,堆栈空间现在可供其他函数使用,例如 main
或 printf
,而那些其他功能正在践踏以前为 data
保留的空间。 .
当您使用 malloc
时,不过,据说内存是在堆上分配的,而不是在堆栈上,并且堆上的内存只有在您告诉它释放时才会释放(使用free
)。与具有自动存储持续时间的变量不同,内存不会在 CreateData
时释放。已经返回,因此您可以继续使用 main
中的内存.
关于c - 函数返回指针与 C 中的函数返回数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23100004/