C中的sizeof(数组):分段错误

时间:2015-03-08 14:21:05

标签: c arrays

我从这段代码中得到一个奇怪的分段错误:

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中的数组有最大大小吗?提前谢谢

2 个答案:

答案 0 :(得分:16)

int array1[10000000];

对于你的堆栈而言太大了,而你的堆栈溢出了

int array1[1000000];

很大,但是当阵列适合它时,不会溢出堆栈。

请注意,堆栈的大小可能因系统而异,可以设置为特定大小。

解决方法:

  1. 制作数组static
  2. 使数组全局化。
  3. 使用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;
}