Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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
当我必须指定内存大小时,malloc数组和正则数组之间有什么区别?_C_Arrays_Malloc_Dynamic Memory Allocation - Fatal编程技术网

当我必须指定内存大小时,malloc数组和正则数组之间有什么区别?

当我必须指定内存大小时,malloc数组和正则数组之间有什么区别?,c,arrays,malloc,dynamic-memory-allocation,C,Arrays,Malloc,Dynamic Memory Allocation,例如,当我必须指定内存大小时,malloc-ed数组和正则数组之间有什么区别 char* arr = malloc(50 * sizeof(char)) vs 嗯,差别太大了。首先,请阅读 也就是说,从可用性的角度来看,我觉得您感兴趣的有三个主要区别 数组的作用域仅限于其封闭块,但动态分配的内存有效,除非手动解除分配。因此,不能重新运行函数的本地数组,但可以使用通过malloc-ing返回的指针 对于非实例,数组大小必须是编译时常量,但对于malloc,则在运行时指定大小。换句话说,对于数

例如,当我必须指定内存大小时,malloc-ed数组和正则数组之间有什么区别

char* arr =  malloc(50 * sizeof(char)) 
vs


嗯,差别太大了。首先,请阅读

也就是说,从可用性的角度来看,我觉得您感兴趣的有三个主要区别

数组的作用域仅限于其封闭块,但动态分配的内存有效,除非手动解除分配。因此,不能重新运行函数的本地数组,但可以使用通过malloc-ing返回的指针

对于非实例,数组大小必须是编译时常量,但对于malloc,则在运行时指定大小。换句话说,对于数组,您需要在编译时知道大小,而对于malloc-ing,完全可以在运行时确定请求的大小

无法重新调整阵列的大小。一旦定义,它们将使用其大小所需的所有内存。OTOH是一个malloc-ed指针,指向一定数量的内存,可以根据需要重新分配给其他数量的内存


嗯,差别太大了。首先,请阅读

也就是说,从可用性的角度来看,我觉得您感兴趣的有三个主要区别

数组的作用域仅限于其封闭块,但动态分配的内存有效,除非手动解除分配。因此,不能重新运行函数的本地数组,但可以使用通过malloc-ing返回的指针

对于非实例,数组大小必须是编译时常量,但对于malloc,则在运行时指定大小。换句话说,对于数组,您需要在编译时知道大小,而对于malloc-ing,完全可以在运行时确定请求的大小

无法重新调整阵列的大小。一旦定义,它们将使用其大小所需的所有内存。OTOH是一个malloc-ed指针,指向一定数量的内存,可以根据需要重新分配给其他数量的内存


因为数组中的大小应该在编译时可用,而使用指针可以在运行时确定它的大小。

因为数组中的大小应该在编译时可用,而使用指针可以在运行时确定它的大小。

来自:

动态内存分配允许程序在运行时获得更多内存空间,或者在不需要时释放内存空间

简单来说,动态内存分配允许您手动处理程序的内存空间

您还可以看到,在静态分配中,编译器分配所需的内存,并且必须在编译时知道存储的确切大小和类型。另一方面,在动态内存分配中,在运行时动态分配的内存和动态分配的空间通常放在称为堆或空闲存储的程序段中

来自:

动态内存分配允许程序在运行时获得更多内存空间,或者在不需要时释放内存空间

简单来说,动态内存分配允许您手动处理程序的内存空间

您还可以看到,在静态分配中,编译器分配所需的内存,并且必须在编译时知道存储的确切大小和类型。另一方面,在动态内存分配中,在运行时动态分配的内存和动态分配的空间通常放在称为堆或空闲存储的程序段中

对于malloc,您使用的大小可以是一个变量!这意味着在执行到达malloc语句之前,大小可能会根据变量的变化而变化。否则,指定声明数组的大小必须是常量

int foo = 5;
char bar[foo]; // This will cause a compile error
char bar[5]; // size is fixed, array size specifiers MUST be constant in C  

void some_func (void) 
{
    // do some work that might change foo, e.g. get a value from user

    char* arr =  malloc(foo * sizeof(char)); //foo is variable, thus the size is variable!
}
请注意,您说过您使用malloc创建了一个数组。这是不正确的。malloc只分配一些连续的内存,并给您一个指向该内存起始点的指针-从技术上讲,这不是一个数组,它可以在相当多的情况下使用,但不是所有情况下都可以使用。使用malloc时,您使用的大小可以是一个变量!这意味着在执行到达malloc语句之前,大小可能会根据变量的变化而变化。否则,指定声明数组的大小必须是常量

int foo = 5;
char bar[foo]; // This will cause a compile error
char bar[5]; // size is fixed, array size specifiers MUST be constant in C  

void some_func (void) 
{
    // do some work that might change foo, e.g. get a value from user

    char* arr =  malloc(foo * sizeof(char)); //foo is variable, thus the size is variable!
}

请注意,您说过您使用malloc创建了一个数组。这是不正确的。malloc只分配一些连续的内存,并给您一个指向该内存起始点的指针——从技术上讲,这并不是一个数组,它可以在相当多的情况下使用,但不是所有情况下都可以使用。主要区别在于,动态分配的内存可以根据需要调整大小;数组静态、自动或可变长度在实例化后无法调整大小

二次差分h 与数组的生存期有关。在文件作用域或使用static关键字声明的数组的生存期会延长到程序的整个生存期。在没有static关键字的函数或块中声明的数组的生存期限制在其封闭范围内,这就是为什么不能从函数返回指向本地数组的指针的原因-当函数退出时,数组将不再存在

动态内存介于两者之间——它的生命周期从最初的*alloc调用一直延续到空闲调用,空闲调用可能在不同的函数中。你直接控制它的寿命


由于自动局部变量的内存通常是如何管理的,因此自动和可变长度数组通常不能任意大-试图创建一个大小超过1兆字节左右的局部数组可能会在流行平台上导致运行时错误。对于动态分配的内存,您通常没有这样的限制

主要区别在于动态分配的内存可以根据需要调整大小;数组静态、自动或可变长度在实例化后无法调整大小

第二个区别与阵列的生存期有关。在文件作用域或使用static关键字声明的数组的生存期会延长到程序的整个生存期。在没有static关键字的函数或块中声明的数组的生存期限制在其封闭范围内,这就是为什么不能从函数返回指向本地数组的指针的原因-当函数退出时,数组将不再存在

动态内存介于两者之间——它的生命周期从最初的*alloc调用一直延续到空闲调用,空闲调用可能在不同的函数中。你直接控制它的寿命


由于自动局部变量的内存通常是如何管理的,因此自动和可变长度数组通常不能任意大-试图创建一个大小超过1兆字节左右的局部数组可能会在流行平台上导致运行时错误。对于动态分配的内存,您通常没有这样的限制

也许你应该添加非VLA。是的,但VLA只是一个选项。也许你应该添加非VLA。是的,但VLA只是一个选项。char和int是完全不同的类型…而且你不会将苹果和桔子进行比较。你的意思是什么-有什么区别?问题Unclarchar和int是完全不同的类型…而且你不会把苹果和桔子做比较。你是什么意思-有什么区别?问题未解决但我不能在运行时从用户那里获取一个int,并将其分配给一个变量,比如x,然后声明一个数组arr[6]?不,因为C语言不允许数组长度以这种方式可变。在这种情况下使用malloc是允许的,但实际上您可以执行char bar[foo]@ChrisTurner这确实会为自动函数作用域数组编译,但会导致全局数组出错。因此,它确实允许数组长度在某些情况下与您之前的注释相反是可变的;但是,我不能在运行时从用户那里得到一个int,并将它赋给一个变量,比如x,然后声明一个数组arr[6]?不,因为C语言不允许数组长度以这种方式可变。在这种情况下使用malloc是允许的,但实际上您可以执行char bar[foo]@ChrisTurner这确实会为自动函数作用域数组编译,但会导致全局数组出错。因此,它确实允许数组长度在某些情况下与您之前的注释相反是可变的;此外,可以通过检查malloc等返回值来检测分配失败,但AFAIK无法检测到分配静态数组或VLA的失败。此外,可以通过检查malloc等返回值来检测分配失败,但AFAIK无法检测到分配静态数组或VLA的失败。