malloc比声明好吗?

malloc比声明好吗?,c,C,可能重复: 这两者之间的区别是什么: char * a = malloc(size); 及 一个比另一个好吗?使用malloc有什么好处吗 您不控制堆栈分配内存的生存期范围,它只在该范围内有效(除非将其设置为静态) malloc用于在堆上分配内存。在您调用该内存上的free之前,它是有效的 在堆栈上分配内存的速度更快,通常是因为您实际上并没有分配新内存,您只是保留了更多您已经使用的内存,但您不控制生命周期,它由您的块或函数的范围控制。您不控制堆栈分配内存的生命周期范围,它只在作用域内有效

可能重复:

这两者之间的区别是什么:

char * a = malloc(size);  


一个比另一个好吗?使用malloc有什么好处吗

您不控制堆栈分配内存的生存期范围,它只在该范围内有效(除非将其设置为静态)

malloc
用于在堆上分配内存。在您调用该内存上的
free
之前,它是有效的


在堆栈上分配内存的速度更快,通常是因为您实际上并没有分配新内存,您只是保留了更多您已经使用的内存,但您不控制生命周期,它由您的块或函数的范围控制。

您不控制堆栈分配内存的生命周期范围,它只在作用域内有效(除非将其设置为静态)

malloc
用于在堆上分配内存。在您调用该内存上的
free
之前,它是有效的

在堆栈上分配内存的速度更快,通常是因为您实际上并没有分配新内存,而是保留了更多您已经使用的内存,但您不控制生命周期,它由您的块或函数的范围控制

char*a=malloc(大小)之间有什么区别和字符*a[size];`

第一个声明指向
char
的指针,并在堆上为其分配
size
字节。第二个分配
size
char
指针。它们不是等价物

这个比另一个好吗

不,它们有不同的用途

使用
malloc()
有什么好处吗


对。如果要从函数返回数组,则不能执行以下操作:

char a[size];
return a;
因为
a
在返回后超出范围,使用它会导致未定义的行为。所以在这种情况下,您必须使用

char *a = malloc(size);
return a;
(通常情况下是这样的,因为您可能希望每次从函数返回一个新字符串-但是,如果这不是一个要求,您可以使用本地声明的静态数组。)

但是,如果阵列仅在本地使用,则通常建议使用自动(堆栈)阵列,而不是
malloc()
,因为这样可以避免增加内存碎片,并且堆栈操作可能比堆访问更快

char*a=malloc(大小)之间有什么区别和字符*a[size];`

第一个声明指向
char
的指针,并在堆上为其分配
size
字节。第二个分配
size
char
指针。它们不是等价物

这个比另一个好吗

不,它们有不同的用途

使用
malloc()
有什么好处吗


对。如果要从函数返回数组,则不能执行以下操作:

char a[size];
return a;
因为
a
在返回后超出范围,使用它会导致未定义的行为。所以在这种情况下,您必须使用

char *a = malloc(size);
return a;
(通常情况下是这样的,因为您可能希望每次从函数返回一个新字符串-但是,如果这不是一个要求,您可以使用本地声明的静态数组。)


但是,如果数组仅在本地使用,则通常建议使用自动(堆栈)数组,而不要使用
malloc()
,因为这样可以避免增加内存碎片,堆栈操作可能比堆访问更快。

请注意,您希望
char[size]
而不是指针。一个是正常的,如果你不是一个绝对出色的程序员,那么另一个必然会导致代码崩溃。请注意,你想要
chara[size]
而不是指针。一个是正常的,另一个必然会导致代码崩溃,如果你不是一个绝对出色的程序员。哇,非常感谢你的快速回答!你能给我举个例子,说明malloc在哪方面工作得更好吗?如果它没有要求太多,因为我想知道在什么情况下,当没有剩余的堆栈空间时,声明会失败堆栈分配失败,那么无限递归会导致相同的问题,堆栈溢出。堆分配允许您访问堆,它可能比您保留的堆栈空间大很多,但不是无限的,或者没有问题。当你打算在较长时间内共享东西时,请使用堆,但要注意堆碎片之类的事情。哇,非常感谢你的快速回答!你能给我举个例子,说明malloc在哪方面工作得更好吗?如果它没有要求太多,因为我想知道在什么情况下,当没有剩余的堆栈空间时,声明会失败堆栈分配失败,那么无限递归会导致相同的问题,堆栈溢出。堆分配允许您访问堆,它可能比您保留的堆栈空间大很多,但不是无限的,或者没有问题。当您打算在较长时间内共享内容时,请使用堆,但要注意堆碎片之类的事情。“如果要从函数返回数组,…,必须使用…”并不完全正确--
static char a[size];返回a
也应该起作用。@JoshuaGreen我没有写“你不能
静态字符a[size];
”,我写了“你不能
静态字符a[size];
”…@JoshuaGreen换句话说,用
静态
关键字声明数组不会产生自动数组,因为它的存储时间是静态的……你是最好的。我现在明白了。非常感谢你们两位,我不同意“必须使用
char*a=malloc(size);返回a;
”的说法,因为提供了一个替代方法。“如果要从函数返回数组,…,必须使用…”是不完全正确的--
static char a[size];返回a也应该可以工作。@JoshuaGreen我没有写“你不能
静态字符a[size];
”,我写的是“你不能