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;
}
谢谢:)
答案 0 :(得分:4)
使用CreateData
的第一个实现,返回一个指向具有自动存储持续时间的变量的指针,然后使用它超过其生命周期,这是未定义的行为。
不太正式,实际发生的是data
在堆栈上分配,一旦您将其用作a
,CreateData
已经结束,那么堆栈空间现在可用于其他功能,例如main
或printf
,而其他功能正在践踏之前为data
保留的空间。
但是,当您使用malloc
时,内存被称为在堆上分配,而不是在堆栈上分配,堆上的内存仅在您告诉它时才会释放被释放(使用free
)。与具有自动存储持续时间的变量不同,当CreateData
返回时,内存将不会被释放,因此您可以继续在main
中使用该内存。
答案 1 :(得分:0)
静态数组(ex. unsigned char data[]="Thanks";
)将在您离开当前堆栈帧时被销毁(基本上,当您返回的函数返回时)。
动态数组(ex. unsigned char *data=malloc(6);
)永远坚持到你free()
为止。它生活在堆上。
答案 2 :(得分:0)
函数1返回指向局部变量的指针(在堆栈上分配)。这是一种未定义的行为。
在函数2中,数据块在堆上分配,因此其值仍然不在函数范围内。