我从这段代码中得到一个奇怪的分段错误:
int main(void){
int array1[10000000];
int n = sizeof(array1);
printf("%d \n", n );
return 0;
}
但是,如果我改变
int array1[10000000];
到
int array1[1000000]; ( one less zero)
该程序可以正常工作并打印4000000
我在Fedora 21(64位)上运行它
这是因为C中的数组有最大大小吗?提前谢谢
答案 0 :(得分:16)
int array1[10000000];
对于你的堆栈而言太大了,而你的堆栈溢出了
int array1[1000000];
很大,但是当阵列适合它时,不会溢出堆栈。
请注意,堆栈的大小可能因系统而异,可以设置为特定大小。
解决方法:
static
。使用malloc
中的stdlib.h
在堆上分配内存:
int *array1;
array1 = malloc(10000000 * sizeof(int));
if(array1 == NULL) /* If `malloc` failed to allocate memory */
{
fputs("Oops! `malloc` failed to allocate memory!\n", stderr);
exit(-1); /* Exit the program with a return value of `-1` ; Requires `stdlib.h` */
}
/* Use the array and after use, free it using */
free(array1);
答案 1 :(得分:2)
解决此问题的另一种方法是使用setrlimit
增加堆栈大小。标准大小为8 MB,至少在我的Linux上。
#include <stdio.h>
#include <errno.h>
#include <sys/resource.h>
static int setstacksize(rlim_t stacksize)
{
struct rlimit rl;
int res;
if ((res = getrlimit(RLIMIT_STACK, &rl)) != 0) {
fprintf(stderr, "getrlimit result = %d, errno = %d\n", res, errno);
return res;
}
if (rl.rlim_cur >= stacksize) return res;
rl.rlim_cur = stacksize;
if ((res = setrlimit(RLIMIT_STACK, &rl)) != 0) {
fprintf(stderr, "setrlimit result = %d, errno = %d\n", res, errno);
}
return res;
}
static int func(void){
int array1[10000000];
int n = sizeof array1;
printf("%d\n", n);
return 0;
}
int main(void){
setstacksize(48 * 1024 * 1024);
func();
return 0;
}