Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.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_Malloc - Fatal编程技术网

哪些大小的数组需要malloc(或全局赋值)?

哪些大小的数组需要malloc(或全局赋值)?,c,malloc,C,Malloc,当我开始使用C时,我很快注意到int-array[big-number]在函数中调用时会导致程序崩溃。没有那么快,我发现我可以通过定义具有全局作用域(在函数之外)的数组或使用malloc来防止这种情况发生 我的问题是: 从哪个大小开始,需要使用上述方法之一来确保我的程序不会崩溃 我的意思是,仅仅使用,例如,inti用于计数器和整数字符[256]用于小数组,还是我应该对所有局部变量使用malloc?您应该使用malloc进行动态内存分配。对于函数中静态大小的数组(或任何其他对象),如果所需内存太大

当我开始使用C时,我很快注意到int-array[big-number]在函数中调用时会导致程序崩溃。没有那么快,我发现我可以通过定义具有全局作用域(在函数之外)的数组或使用malloc来防止这种情况发生

我的问题是:

从哪个大小开始,需要使用上述方法之一来确保我的程序不会崩溃


我的意思是,仅仅使用,例如,
inti
用于计数器和
整数字符[256]
用于小数组,还是我应该对所有局部变量使用malloc?

您应该使用
malloc
进行动态内存分配。对于函数中静态大小的数组(或任何其他对象),如果所需内存太大,则很快就会出现分段错误。我不认为可以定义“安全限制”,它可能是特定于实现的,其他因素也在起作用,比如当前堆栈和当前函数调用方创建的堆栈中的对象。我想说,只要不涉及递归,页面大小(通常为4kb)以下的任何内容都应该是安全的,但我不认为有这样的保证。

您应该使用
malloc
进行动态内存分配。对于函数中静态大小的数组(或任何其他对象),如果所需内存太大,则很快就会出现分段错误。我不认为可以定义“安全限制”,它可能是特定于实现的,其他因素也在起作用,比如当前堆栈和当前函数调用方创建的堆栈中的对象。我想说,只要不涉及递归,页面大小(通常为4kb)以下的任何内容都应该是安全的,但我不认为有这样的保证。

您应该理解函数中的
int chars[256]
与使用
malloc()
之间的区别

简而言之,前者将整个数组放在堆栈上。后者分配从堆请求的内存。一般来说,堆比堆栈大得多,但每个堆栈的大小都可以调整


另一个关键区别是,从方法返回后,从技术上讲,在堆栈上分配的变量将消失。(哦,如果您继续访问该数组,您的程序可能一点也不会消失,但危险潜伏着。)分配给malloc的一大块内存将保持分配状态,直到您显式释放它或程序退出。

您应该理解
int chars[256]之间的区别
在函数中使用
malloc()

简而言之,前者将整个数组放在堆栈上。后者分配从堆请求的内存。一般来说,堆比堆栈大得多,但每个堆栈的大小都可以调整


另一个关键区别是,从方法返回后,从技术上讲,在堆栈上分配的变量将消失。(哦,如果您继续访问该阵列,您的程序可能会像一点也没有消失一样运行,但危险潜伏着。)分配给malloc的大量内存将保持分配状态,直到您显式释放它或程序退出。

这取决于具体情况。如果你保证一条线永远不会超过100。。。1000个字符,您可以使用固定大小的缓冲区。如果你没有:你没有。在整洁的xKB配置文件和xGB XML文件(没有CR/LF)中读取是有区别的。视情况而定


下一个选择是:您想让您的程序优雅地消亡吗?这只是一种设计选择。

视情况而定。如果你保证一条线永远不会超过100。。。1000个字符,您可以使用固定大小的缓冲区。如果你没有:你没有。在整洁的xKB配置文件和xGB XML文件(没有CR/LF)中读取是有区别的。视情况而定


下一个选择是:您想让您的程序优雅地消亡吗?这只是一种设计选择。

调整堆栈大小听起来很有趣。这将保证稳定到一定的(更重要的是:我知道)数组大小。我该怎么做?这取决于你的编译器/链接器。你可以用谷歌搜索。我对编译语言还不熟悉,所以我不知道这是由链接器定义的<代码>-帮助提供了必要的开关。通常,只有在内存非常紧张的设备上进行嵌入式编程时,才需要更改堆栈的大小。在这种情况下,您可能会将堆栈大小设置为尽可能低。我想说,在大多数情况下,您不会仅仅为了分配更大的数组作为局部变量而增加堆栈大小。在这种情况下,您可能需要重新考虑您的设计。(另一个注释中的“K-Balo”提到递归,这可能会让您考虑增加堆栈大小)。还要注意,如果在函数中静态声明数组(即静态int BigSalk(1000)),它将被放置在堆而不是堆栈上。除了作用域之外,这与您的第一个工作解决方案(全局变量)没有什么不同。调整堆栈大小听起来很有趣。这将保证稳定到一定的(更重要的是:我知道)数组大小。我该怎么做?这取决于你的编译器/链接器。你可以用谷歌搜索。我对编译语言还不熟悉,所以我不知道这是由链接器定义的<代码>-帮助提供了必要的开关。通常,只有在内存非常紧张的设备上进行嵌入式编程时,才需要更改堆栈的大小。在这种情况下,您可能会将堆栈大小设置为尽可能低。我想说,在大多数情况下,您不会仅仅为了分配更大的数组作为局部变量而增加堆栈大小。