5

可能是在 SO 上找到的类似问题。但是,我没有发现,这是场景

情况1

void main()
{
    char g[10];
    char a[10];
    scanf("%[^\n] %[^\n]",a,g);
    swap(a,g);
    printf("%s %s",a,g);
}

案例2

void main()
{
    char *g=malloc(sizeof(char)*10);
    char *a=malloc(sizeof(char)*10);
    scanf("%[^\n] %[^\n]",a,g);
    swap(a,g);
    printf("%s %s",a,g);
}

在这两种情况下我都得到相同的输出。所以,我的问题是我应该什么时候更喜欢malloc()而不是array反之亦然,为什么?我找到了通用定义,malloc()提供了动态分配。所以,这是他们之间唯一的区别??请任何人举例说明,dynamic尽管我们在malloc().

4

3 回答 3

6

主要区别在于您何时以及如何确定数组长度。使用固定长度数组会强制您在编译时确定数组长度。相比之下 usingmalloc允许您在运行时决定数组长度。

特别是,在运行时决定允许您根据用户输入和编译时未知的信息做出决定。例如,您可以将数组分配为足够大的大小以适应用户输入的实际数据。如果您使用固定长度的数组,您必须在编译时确定一个上限,然后将该限制强加给用户。

另一个更微妙的问题是,将非常大的固定长度数组分配为局部变量会导致堆栈溢出运行时错误。出于这个原因,您有时更喜欢使用malloc.

于 2012-12-23T18:44:39.510 回答
2

请任何人举例说明,虽然我们指定了大小,但动态的含义是什么。

我怀疑这在 C99 之前很重要。在 C99 之前,您不能拥有动态大小的自动数组:

void somefunc(size_t sz)
{
    char buf[sz];
}

是有效的 C99 但无效的 C89。但是,使用malloc(),您可以指定任何值,而不必malloc()使用常量作为其参数进行调用。

此外,为了弄清楚其他用途malloc():您不能从函数返回堆栈分配的内存,因此如果您的函数需要返回分配的内存,您通常使用malloc()(或 malloc 家族的其他成员,包括realloc()and calloc())获得一块内存。要理解这一点,请考虑以下代码:

char *foo()
{
    char buf[13] = "Hello world!";
    return buf;
}

由于buf是一个局部变量,它在其封闭函数的末尾无效 - 返回它会导致未定义的行为。上面的函数是错误的。但是,通过函数调用获得的指针malloc()仍然有效(直到你不调用free()它):

char *bar()
{
    char *buf = malloc(13);
    strcpy(buf, "Hello World!");
    return buf;
}

这是绝对有效的。

于 2012-12-23T18:48:47.443 回答
0

我要补充一点,在这个特定的示例中, malloc() 非常浪费,因为为数组分配的内存比 [由于 malloc 的开销] 以及调用 malloc() 和稍后所花费的时间要多free() - 程序员需要记住释放它的开销 - 内存泄漏可能很难调试。

编辑:举个例子,您的代码在 main() 末尾缺少 free() - 在这里可能无关紧要,但它很好地说明了我的观点。

因此,通常应该在堆栈上分配小结构(小于 100 字节)。如果您有大型数据结构,最好使用 malloc 分配它们(或者,如果这样做是正确的,请使用全局变量 - 但这是一个敏感主题)。

显然,如果您事先不知道某个东西的大小,并且它可能非常大(大小为千字节),那绝对是“考虑使用 malloc”的情况。

另一方面,如今堆栈相当大(至少对于“真正的计算机”而言),因此分配几千字节的堆栈并不是什么大问题。

于 2012-12-23T18:56:52.937 回答