Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中函数返回指针与函数返回数组的比较_C_Arrays_Pointers - Fatal编程技术网

C语言中函数返回指针与函数返回数组的比较

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; }

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
的第一个实现,您返回一个指向具有自动存储持续时间的变量的指针,然后在其生命周期后使用它,这是一种未定义的行为

不太正式的是,实际发生的情况是
数据
被分配到堆栈上,一旦您开始将其用作
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()
。谢谢,先生。这很有帮助……:)谢谢,先生。这很有帮助……)