函数返回指针vs函数返回C中的数组

时间:2014-04-16 04:29:31

标签: 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;
}

谢谢:)

3 个答案:

答案 0 :(得分:4)

使用CreateData的第一个实现,返回一个指向具有自动存储持续时间的变量的指针,然后使用它超过其生命周期,这是未定义的行为。

不太正式,实际发生的是data在堆栈上分配,一旦您将其用作aCreateData已经结束,那么堆栈空间现在可用于其他功能,例如mainprintf,而其他功能正在践踏之前为data保留的空间。

但是,当您使用malloc时,内存被称为在堆上分配,而不是在堆栈上分配,堆上的内存仅在告诉它时才会释放被释放(使用free)。与具有自动存储持续时间的变量不同,当CreateData返回时,内存将不会被释放,因此您可以继续在main中使用该内存。

答案 1 :(得分:0)

静态数组(ex. unsigned char data[]="Thanks";)将在您离开当前堆栈帧时被销毁(基本上,当您返回的函数返回时)。

动态数组(ex. unsigned char *data=malloc(6);)永远坚持到你free()为止。它生活在堆上。

答案 2 :(得分:0)

函数1返回指向局部变量的指针(在堆栈上分配)。这是一种未定义的行为。

在函数2中,数据块在堆上分配,因此其值仍然不在函数范围内。