c - 函数返回指针与 C 中的函数返回数组

标签 c arrays pointers

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已经结束,堆栈空间现在可供其他函数使用,例如 mainprintf ,而那些其他功能正在践踏以前为 data 保留的空间。 .

当您使用 malloc 时,不过,据说内存是在堆上分配的,而不是在堆栈上,并且堆上的内存只有在告诉它释放时才会释放(使用free)。与具有自动存储持续时间的变量不同,内存不会在 CreateData 时释放。已经返回,因此您可以继续使用 main 中的内存.

关于c - 函数返回指针与 C 中的函数返回数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23100004/

相关文章:

c - 警告 : assignment makes pointer from integer without a cast

c - 使 stdin 以安全且可移植的方式可写

c - 当堆栈增长时,谁负责向操作系统请求页面?

java - 比较两个数组,然后使用公共(public)元素创建另一个数组(并且不重复)

c - 为什么 realloc() 会使我的程序崩溃?

xcode - 这个 Swift 结构实际使用了多少存储空间?

c++ - 运算符 "new"仅返回一个类的非本地堆指针?

c - 如何使用基于 OpenSSL 的客户端提取预主 key ?

c - 算术 double 表达式和 c/c++

javascript - 在 for 循环内循环 - 嵌套数组