【发布时间】:2012-12-03 20:14:29
【问题描述】:
有什么区别:
char * a = malloc(size);
和
char a[size];
一个比另一个更好吗?使用malloc有什么好处吗?
【问题讨论】:
-
请注意,您需要
char a[size]而不是指针。 -
一个是理智的,如果你不是一个绝对出色的程序员,另一个总是会导致代码损坏。
标签: c
有什么区别:
char * a = malloc(size);
和
char a[size];
一个比另一个更好吗?使用malloc有什么好处吗?
【问题讨论】:
char a[size] 而不是指针。
标签: c
char *a = malloc(size);和 char *a[size];` 有什么区别?
第一个声明指向char 的指针并在堆上为其分配size 字节。第二个分配size 块char 指针。它们不相等。
一个比另一个更好吗?
不,它们有不同的用途。
使用
malloc()有什么好处吗?
是的。如果你想从函数中返回一个数组,你不能这样做:
char a[size];
return a;
因为 a 在返回后超出范围,使用它会导致未定义的行为。所以在这种情况下你必须使用
char *a = malloc(size);
return a;
(通常是这种情况,因为您可能希望每次从函数中返回一个新字符串 - 但是,如果这不是必需的,您可以使用本地声明的静态数组。)
但是,如果数组只用于本地,那么通常建议使用自动(堆栈)数组而不是malloc(),因为这样可以避免增加内存碎片,并且堆栈操作可以比堆访问更快。
【讨论】:
static char a[size]; return a; 也应该可以工作。
static char a[size];”,我写的是“你不能做char a[size];”...
static 关键字声明数组不会导致自动数组,因为它的存储持续时间是静态的...
char *a = malloc(size); return a;”的说法。
您无法控制堆栈分配内存的生命周期范围,它仅在该范围内有效(除非您将其设为静态)。
malloc 用于在堆上分配内存。在您对该内存调用 free 之前,它一直有效。
在堆栈上分配内存更快,通常是因为您实际上并没有分配新内存,您只是保留了更多已经在使用的内存,但您无法控制生命周期,它由块或函数的范围。
【讨论】: