Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.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_Malloc - Fatal编程技术网

C 分配之间的差异

C 分配之间的差异,c,arrays,pointers,malloc,C,Arrays,Pointers,Malloc,可能重复: 这两个项目之间有区别吗 int main(void) { char str[80]; } 及 那么使用malloc和类似数组的语法之间有什么区别呢?因此,如果我需要80个字符的内存,我应该使用malloc,而不是其他可能的方法,对吗 我试着回答我自己的问题 第一个在堆栈上分配,当变量超出范围时将被释放。第二个在堆上,并且必须显式为free()'d 两者都可以作为指针传递。在第一种情况下,在堆栈上分配80个字符,在第二种情况下,在堆上分配内存 两者都可以用作指针,并传递给函

可能重复:

这两个项目之间有区别吗

int main(void) {
    char str[80];
}

那么使用
malloc
和类似数组的语法之间有什么区别呢?因此,如果我需要80个字符的内存,我应该使用
malloc
,而不是其他可能的方法,对吗


我试着回答我自己的问题

第一个在堆栈上分配,当变量超出范围时将被释放。第二个在堆上,并且必须显式为free()'d


两者都可以作为指针传递。

在第一种情况下,在堆栈上分配80个字符,在第二种情况下,在堆上分配内存

两者都可以用作指针,并传递给函数,还可以与数组索引语法一起使用

char str[80];
在堆栈上分配80个字节。当
str
超出范围时,这将自动回收

char * str = (char*) malloc( sizeof(char) * 80 );
在堆上分配80个字节。在调用
free
之前,此内存一直可用

注意,第二种情况可以简化为

char * str = malloc(80);
i、 e.您不应该在C中从
malloc
中转换返回值,并且
sizeof(char)
保证为1

+1,但我会更进一步,而不是“没有必要”。强制转换malloc的返回值可以隐藏某些细微的错误,否则这些错误将被标记,特别是在指针和int的宽度不相同的情况下。@paxdiablo Good point。我(希望)改进了我答案那部分的措辞。
char * str = malloc(80);