在数组上使用malloc

在数组上使用malloc,c,arrays,malloc,dynamic-memory-allocation,C,Arrays,Malloc,Dynamic Memory Allocation,可能会发现类似的问题。但是,我没有发现,这是一个场景 案例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); sc

可能会发现类似的问题。但是,我没有发现,这是一个场景

案例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()

中指定了大小,但原则上的差异与您决定数组长度的时间和方式有关。使用固定长度数组迫使您在编译时决定数组长度。相反,使用
malloc
可以在运行时决定数组长度

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

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

请任何人举例说明,动态的含义是什么,尽管我们正在指定大小

我怀疑这在C99之前很重要。在C99之前,您无法动态调整自动阵列的大小:

void somefunc(size_t sz)
{
    char buf[sz];
}
是有效的C99,但无效的C89。但是,使用
malloc()
,可以指定任何值,而不必使用常量作为参数调用
malloc()

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

char *foo()
{
    char buf[13] = "Hello world!";
    return buf;
}
由于
buf
是一个局部变量,它在其封闭函数的末尾无效-返回它会导致未定义的行为上面的函数是错误的。但是,使用
malloc()
获得的指针在函数调用过程中保持有效(直到您没有对其调用
free()
):


这是绝对有效的。

我要补充的是,在这个特定的示例中,malloc()非常浪费,因为分配给数组的内存比会出现的内存还要多【由于malloc中的开销】以及调用malloc()和以后的free()所需的时间-而且程序员要记住释放内存会有开销-内存泄漏可能很难调试

编辑:举例来说,您的代码缺少main()结尾的free()-在这里可能不重要,但它很好地说明了我的观点

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

显然,如果您事先不知道某个内容的大小,并且它可能非常大(大小为千字节),那么肯定是“考虑使用malloc”


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

sizeof char
总是
1
FYII会很感激,如果你能解释一下的话examples@var___看到我的答案了吗(并努力理解这一点,这是非常基本的…)是的,我在尝试,有一件事每次都让我困惑,那就是
动态
。也许,我在试图从你的答案中找出答案。在这种情况下,动态是运行时的同义词。你的关键是要理解在编译时决定数组长度与在运行时决定数组长度之间的区别。@var\uuuo:动态是asso与请求的内存分配时间相关,而不是与分配的内存量相关。使用malloc,在程序执行期间,您不能请求分配任意数量的内存。对于数组,称为静态内存分配()由于程序向编译器指定编译时本身需要多少内存。另一方面,即使在调用malloc时指定需要多少内存,它也不会分配,直到调用完成。只要您在编译时知道需要多少内存,这个建议就行了是的,或者至少您知道这一点“不会超过这个,并且检查它不会超过这个。”我只是不喜欢“在不知道输入大小时使用malloc”的一般建议“-有一个1000个字符的缓冲区来输入文件名是非常好的,您不需要在运行时通过getchar和realloc读取文件名,以确保其正确匹配…”。。。
char *bar()
{
    char *buf = malloc(13);
    strcpy(buf, "Hello World!");
    return buf;
}