无法弄清楚为什么我在初始化我的阵列时遇到分段错误

时间:2014-01-28 06:20:42

标签: c segmentation-fault

我有以下代码,对于N = 10和C = 25可以正常工作,但如果我使用N = 50和C = 25500

则会出现分段错误的炸弹
#include <stdio.h>
#include <stdlib.h>

// create table
int *table;
table  = (int *) malloc(sizeof(int) * C+1 * N+1);
if(table == NULL){
  printf("[ERROR] : Fail to allocate memory.\n");
}

// initialize table
for(i =0; i < N-1; i++){
  for(j = 0; j < C-1; j++){
    //table[i*(C+1)+j]=0;
    *(table + (i*(C+1)+j))=1;
  }
}
printf("table made\n");

2 个答案:

答案 0 :(得分:3)

我相信您分配的内存量不正确。您正在分配C*sizeof(int) + N + 1,并且您希望分配(C+1)*(N+1)*sizeof(int)
你只是错过了一些问题 - http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence

答案 1 :(得分:3)

假设int = 4,那么你分配

4*50 + 1*25500 + 1 = 25701 bytes

在循环中,您可以访问(最后):

i = 49
j = 25499

49*(25501)+25499 = 1275048(index)*4 = 5100192 (offset)

所以你需要的是:

 table  = malloc(sizeof(int) * (C+1) * (N+1));

您的循环也不适用于较小的值,它只是没有崩溃。在分配的内存之外写入是不确定的行为。

作为旁注,与您的崩溃无关: Do I cast the result of malloc?