英文:
Array max size in C language
问题
在C语言中,动态数组的最大大小取决于系统的可用内存和操作系统的限制。在您的示例中,当尝试分配一个包含10000000个随机整数的动态数组时,您遇到了分段错误。这可能是因为您的系统上没有足够的可用内存来分配如此大的数组。
要增加可分配的数组大小,您可以考虑以下几种方法:
- 使用64位操作系统:如果您的系统是64位的,它通常能够分配更大的内存块。
- 增加虚拟内存:您可以尝试增加系统的虚拟内存大小,以便在物理内存不足时使用磁盘上的虚拟内存。
- 优化内存使用:如果可能的话,考虑优化数据结构或算法,以减少内存使用。
请注意,尝试分配过大的内存块可能导致性能下降和系统不稳定,因此需要谨慎操作。此外,确保在使用完动态分配的内存后使用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
- 不要使用保留的标识符(
_
前缀)。 - 不要从
malloc()
强制转换void *
。 - 检查所有
malloc()
的返回值。 - 优先传递变量而不是类型给
sizeof
。 - 让调用者决定如何处理错误。
- 将
srand()
移动到main()
。这样,如果您打印出种子,容易重现错误。 - 如果
malloc()
分配array->data
失败,请释放array
,否则它会泄漏,因为现在我们在失败时返回NULL
。 - 在完成时释放
array
。您可能想编写一个包含这两个功能的函数。 - 优先使用初始化的变量(
Array *array = malloc(...);
而不是Array *array;
)。min
和max
未初始化。您可以吗?
#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:
- Don't use identifiers that are reserved (
_
prefix). - Don't cast
void *
frommalloc()
. - Check return value for all
malloc()
. - Prefer passing the variable instead of the type to
sizeof
. - Let caller decide how to handle error.
- Move
srand()
tomain()
. This makes it easy to reproduce errors if you print out the seed. free(array)
ifmalloc()
ofarray->data
fails otherwise it leaks now that wereturn NULL
on failure.free()
array when done. You probably want to write a function that has those two.- Prefer initialized variables (
Array *array = malloc(...);
instead ofArray *array;
).min
andmax
are not initialized. Can you?
#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, "Error: memory allocation failed.\n");
return NULL;
}
array->size = size;
array->data = malloc(sizeof *array->data * size);
if (!array->data) {
fprintf(stderr, "Error: memory allocation failed.\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);
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论