C语言中函数返回指针与函数返回数组的比较
func1给出警告和垃圾值,而func2给出正确的输出。这两者有什么区别C语言中函数返回指针与函数返回数组的比较,c,arrays,pointers,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; }
//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
的第一个实现,您返回一个指向具有自动存储持续时间的变量的指针,然后在其生命周期后使用它,这是一种未定义的行为
不太正式的是,实际发生的情况是数据
被分配到堆栈上,一旦您开始将其用作a
,CreateData
已经结束,堆栈空间现在可供其他函数使用,如main
或printf
,而那些其他的功能正在践踏以前为数据
保留的空间
但是,当您使用
malloc
时,内存被认为是在堆上分配的,而不是在堆栈上分配的,并且堆上的内存只有在您告诉它要释放时才会释放(使用free
)。与具有自动存储持续时间的变量不同,当CreateData
返回时,不会释放内存,因此您可以使用CreateData
的第一个实现继续在main
中使用该内存,您返回一个指向具有自动存储持续时间的变量的指针,然后在其生存期后使用它,这是一种未定义的行为
不太正式的是,实际发生的情况是数据
被分配到堆栈上,一旦您开始将其用作a
,CreateData
已经结束,堆栈空间现在可供其他函数使用,如main
或printf
,而那些其他的功能正在践踏以前为数据
保留的空间
但是,当您使用malloc
时,内存被认为是在堆上分配的,而不是在堆栈上分配的,并且堆上的内存只有在您告诉它要释放时才会释放(使用free
)。与具有自动存储持续时间的变量不同,当CreateData
返回时,内存将不会释放,因此您可以继续在main
中使用该内存。一旦离开当前堆栈帧,静态数组(ex.unsigned char data[]=“Thank”;
)将被销毁(基本上,当您所在的函数返回时)
动态数组(ex.unsigned char*data=malloc(6);
)将永远存在,直到您找到它。它在堆上存在。静态数组(ex.unsigned char data[]=“谢谢”;
)将在您离开当前堆栈帧时销毁(基本上是在函数返回时)
动态数组(
ex.unsigned char*data=malloc(6);
)会一直存在,直到您找到它为止。它存在于堆上。函数1返回指向局部变量(在堆栈上分配)的指针。这是一种未定义的行为
在函数2中,数据块在堆上分配,因此其值不在函数范围内。函数1返回一个指向局部变量(在堆栈上分配)的指针。这是一种未定义的行为
在函数2中,数据块是在堆上分配的,因此其值不在函数的作用域内。在函数1中,您正在堆栈中创建一个名为data的变量,当函数返回时,它将被销毁。如果在堆栈上创建指针或数组,则不能从函数返回它们-必须使用malloc。@JerryJeremiah谢谢。malloc从堆中获取内存。因此,这对整个程序都是有效的。对吗?直到程序结束或您调用free以获取指针。@JerryJeremiah ok。谢谢:)@GriffinG:不,根本没有编写空字符,因为代码使用
strncpy()
而不是strcpy()
。在func1中,您正在堆栈中创建一个名为data的变量,当函数返回时,该变量将被销毁。如果在堆栈上创建指针或数组,则不能从函数返回它们-必须使用malloc。@JerryJeremiah,谢谢。malloc从堆中获取内存。因此,这将持续整个程序。对吗?直到程序结束或者你调用free获取指针。@JerryJeremiah ok。谢谢:)@GriffinG:不,根本没有编写空字符,因为代码使用strncpy()
而不是strcpy()
。谢谢,先生。这很有帮助……:)谢谢,先生。这很有帮助……)