【问题标题】:segmentation fault (core dumped) when dynamically allocating a 2d array动态分配二维数组时出现分段错误(核心转储)
【发布时间】:2021-08-04 16:10:59
【问题描述】:

当使用动态分配的二维数组时,我得到一个segmentation fault (core dumped)。我的代码如下:

#define TMILKY 1e4 
#define TABLE_SIZE 10000

struct func_params{
    double *(pop)[3];
};

我想分配一个由 TABLE_SIZE 行和 3 列组成的二维数组。

int main(int argc, char **argv){
    struct func_params params;
    double t=0; 
    int i=0;

    params.pop[3] = malloc(sizeof(*params.pop[0]) * TABLE_SIZE);  
    if (params.pop == NULL) printf("population: allocation failed"); 
    while (t<TMILKY){  
        params.pop[0][i]=0;  
        params.pop[1][i]=2;
        params.population[2][i]=0;              
        printf("i %d t %e P %e B %e \n",i,t,params.population[0][i],params.population[1][i]);
        t = t+100;
        i++; 
    }
    
    free(params.population[3]); /* deallocate the buffer */

    return(0);
}

有人可以帮忙找出我的错误吗...?

【问题讨论】:

  • 您的struct func_params 没有任何名为pop 的成员。请发帖Minimal, Reproducible Example
  • @KamilCuk 1e4 整数是10000,而不是1000
  • params.pop[3] 超出范围,因此您不能在那里分配任何内容。
  • @KamilCuk 将malloc() 用于大型数组是避免堆栈溢出的好策略,即使大小不变。
  • 然后在你的代码中使用10000。不是浮点值,例如 1e41e4 等浮点值的精度有限。您可以将1e7 放入您的代码中,期望得到10000000 作为值,但实际上得到9999932。发生这种情况的确切点和您获得的确切值无关紧要 - 使用浮点值来定义数组的大小基本上是错误

标签: c segmentation-fault malloc


【解决方案1】:

params.pop[3] 是一个超出范围的元素。你不能在那里读或写任何东西。

您必须对params.pop 的每个元素使用malloc()free(),而不是使用它。

分配:

for (int j = 0; j < 3; j++) {
    params.pop[j] = malloc(sizeof(*params.pop[j]) * TABLE_SIZE);  
}

释放:

for (int j = 0; j < 3; j++) {
    free(params.pop[j]);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多