[英]function returning pointer vs function returning array in C
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
使用该内存。
函数1返回一个指向局部变量的指针(分配在堆栈上)。 这是未定义的行为。
在函数2中,数据块是在堆上分配的,因此其值会持续存在于函数范围之外。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.