在C语言中,数组的最大大小是多少?

huangapple go评论60阅读模式
英文:

Array max size in C language

问题

在C语言中,动态数组的最大大小取决于系统的可用内存和操作系统的限制。在您的示例中,当尝试分配一个包含10000000个随机整数的动态数组时,您遇到了分段错误。这可能是因为您的系统上没有足够的可用内存来分配如此大的数组。

要增加可分配的数组大小,您可以考虑以下几种方法:

  1. 使用64位操作系统:如果您的系统是64位的,它通常能够分配更大的内存块。
  2. 增加虚拟内存:您可以尝试增加系统的虚拟内存大小,以便在物理内存不足时使用磁盘上的虚拟内存。
  3. 优化内存使用:如果可能的话,考虑优化数据结构或算法,以减少内存使用。

请注意,尝试分配过大的内存块可能导致性能下降和系统不稳定,因此需要谨慎操作。此外,确保在使用完动态分配的内存后使用free函数释放它,以避免内存泄漏。

英文:

I have a small question that may seem a bit silly at first, but what is the maximum size that I can allocate to a dynamic array in C? Is it possible to increase this size?

I'm asking this question cause I had a segfault when I wanted to allocate a size of 10000000 random integers. I give you my code below, my code is correct !

typedef struct _Array	Array;

struct		_Array
{
	unsigned int		size;
	int			*data;
	int min, max;
};

Array	*random_array(unsigned int size)
{
	Array	*array;

	array = (Array *)malloc(sizeof(Array));
	array->size = size;
	array->data = (int *)malloc(size * sizeof(int));
	if (array->data == NULL)
	{
		fprintf(stderr, "Error: memory allocation failed.\n");
		exit(1);
	}
	srand(time(NULL));
	for (unsigned int i = 0; i < size; i++)
	{
		array->data[i] = rand();
	}
	return (array);
}

I got this in shell :

merge sort: 0.154297 second(s), 697539 random integers
merge sort: 0.164062 second(s), 777756 random integers
merge sort: 0.185547 second(s), 867197 random integers
merge sort: 0.214844 second(s), 966924 random integers
merge sort: 0.234375 second(s), 1078120 random integers
merge sort: 0.263672 second(s), 1202103 random integers
merge sort: 0.296875 second(s), 1340344 random integers
merge sort: 0.332031 second(s), 1494483 random integers
merge sort: 0.369141 second(s), 1666348 random integers
merge sort: 0.423828 second(s), 1857978 random integers
merge sort: 0.468750 second(s), 2071645 random integers
Segmentation fault (core dumped)

答案1

得分: 3

  1. 不要使用保留的标识符(_ 前缀)。
  2. 不要从 malloc() 强制转换 void *
  3. 检查所有 malloc() 的返回值。
  4. 优先传递变量而不是类型给 sizeof
  5. 让调用者决定如何处理错误。
  6. srand() 移动到 main()。这样,如果您打印出种子,容易重现错误。
  7. 如果 malloc() 分配 array->data 失败,请释放 array,否则它会泄漏,因为现在我们在失败时返回 NULL
  8. 在完成时释放 array。您可能想编写一个包含这两个功能的函数。
  9. 优先使用初始化的变量(Array *array = malloc(...); 而不是 Array *array;)。minmax 未初始化。您可以吗?
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

typedef struct Array {
    unsigned int size;
    int *data;
    int min;
    int max;
} Array;

Array *random_array(unsigned int size) {
    Array *array = malloc(sizeof *array);
    if (!array) {
        fprintf(stderr, "错误:内存分配失败。\n");
        return NULL;
    }
    array->size = size;
    array->data = malloc(sizeof *array->data * size);
    if (!array->data) {
        fprintf(stderr, "错误:内存分配失败。\n");
        free(array);
        return NULL;
    }
    for (unsigned int i = 0; i < size; i++)
        array->data[i] = rand();
    return array;
}

int main(void) {
    srand(time(NULL));
    Array *array = random_array(10000000);
    if (array) free(array->data);
    free(array);
}
英文:

I can't reproduce the segfault but there are changes I would make. Mentioned most of them in the comments:

  1. Don't use identifiers that are reserved (_ prefix).
  2. Don't cast void * from malloc().
  3. Check return value for all malloc().
  4. Prefer passing the variable instead of the type to sizeof.
  5. Let caller decide how to handle error.
  6. Move srand() to main(). This makes it easy to reproduce errors if you print out the seed.
  7. free(array) if malloc() of array-&gt;data fails otherwise it leaks now that we return NULL on failure.
  8. free() array when done. You probably want to write a function that has those two.
  9. Prefer initialized variables (Array *array = malloc(...); instead of Array *array;). min and max are not initialized. Can you?
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;time.h&gt;

typedef struct Array {
	unsigned int size;
	int *data;
	int min;
	int max;
} Array;

Array *random_array(unsigned int size) {
	Array *array = malloc(sizeof *array);
	if(!array) {
		fprintf(stderr, &quot;Error: memory allocation failed.\n&quot;);
		return NULL;
	}
	array-&gt;size = size;
	array-&gt;data = malloc(sizeof *array-&gt;data * size);
	if (!array-&gt;data) {
		fprintf(stderr, &quot;Error: memory allocation failed.\n&quot;);
		free(array);
		return NULL;
	}
	for (unsigned int i = 0; i &lt; size; i++)
		array-&gt;data[i] = rand();
	return array;
}

int main(void) {
	srand(time(NULL));
	Array *array = random_array(10000000);
    if(array) free(array-&gt;data);
    free(array);
}

huangapple
  • 本文由 发表于 2023年5月11日 04:17:10
  • 转载请务必保留本文链接:https://go.coder-hub.com/76222265.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定