【问题标题】:can't figure out why I am getting a segmentation fault initializing my array无法弄清楚为什么我在初始化数组时遇到分段错误
【发布时间】:2014-01-28 06:20:42
【问题描述】:

我有以下代码,它适用于 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");

【问题讨论】:

  • 所以这在没有main() 的情况下工作?
  • 确保 malloc 内部的数学运算是正确的,(您可能的意思是 (C+1)*(N+1))
  • 您从哪里得到分段错误错误?将 printf 语句放入 for 循环并尝试找出您在哪个位置遇到分段错误。因为如果 malloc 没有为大量内存分配任何内存,我们可以在if(table == NULL) 条件中找到。请试试这个
  • valgrind 是帮助解决此类问题的好工具。

标签: c segmentation-fault


【解决方案1】:

我认为您分配的内存量不正确。您正在分配 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

【讨论】:

  • ugg。我应该看到的。谢谢
【解决方案2】:

假设 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?

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 2019-05-05
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多