动态分配2D数组时出现分段错误

时间:2016-01-30 11:33:45

标签: c arrays

我很确定那些了解指针方式的人会对我生气,因为这似乎是一个已经回答过的问题,但是我无法理解我在做这个三重指针时做错了什么......所以我提前道歉......

我试图通过这个函数动态分配一个二维数组:

#include <stdio.h>
#include <stdlib.h>

float **alloctab(int dim1, int dim2) {
    float **ptr;

    ptr = malloc(dim1*sizeof(float *));
    if (ptr != NULL) {
    int i, taille_ligne = dim2*sizeof(float);
    float *tmp = malloc(dim1*taille_ligne);
    if (tmp != NULL) {
        for (i=0; i<dim1; i++) {
        ptr[i] = tmp;
        tmp += dim2;
        }
    }
    else
    ptr = NULL;
    }
    return(ptr);
}

int call_alloc(float ***ptr, int d1,int d2)
{
    int i,j;
    *ptr = alloctab(d1,d2);

    for (i=0;i<d1;i++)
    for (j=0;j<d2;j++)
        {
        *ptr[i][j]=(float)i+(float)j;
        printf("ptr[%d][%d]=%f\n",i,j,*ptr[i][j]);
        }
    return 0;
} 

int main() 
{
    float ***tab = NULL;
    int d1=6,d2=8;
    call_alloc(tab,d1,d2);
    return 0;
}

当然我在使用它时会遇到分段错误,虽然-Wall模式下的编译器不会抱怨任何事情......

感谢您的帮助!!

2 个答案:

答案 0 :(得分:1)

您的代码中有两个错误:

  1. *ptr[i][j](*ptr)[i][j]
  2. 不同
  3. float ***tab = NULL; call_alloc(tab,d1,d2);将NULL指针传递给函数call_alloc
  4. 像这样调整你的代码:

    int call_alloc(float ***ptr, int d1,int d2)
    {
        int i,j;
        *ptr = alloctab(d1,d2);
    
        for (i=0;i<d1;i++)
        {
            for (j=0;j<d2;j++)
            {
                (*ptr)[i][j]=(float)i+(float)j;
             // ^    ^
                printf("ptr[%d][%d]=%f\n",i,j,(*ptr)[i][j]);
                                           // ^    ^ 
            }
        }
        return 0;
    } 
    
    int testmain() 
    {
        float **tab = NULL;
           // ^^
        int d1=6,d2=8;
        call_alloc(&tab,d1,d2);
                // ^
        return 0;
    }
    

    请注意,您的代码不会free内存。

答案 1 :(得分:-1)

  • 只需使用以下代码替换此代码,

    int call_alloc(float **ptr, int d1,int d2)
    {
       int i,j;
       ptr = alloctab(d1,d2);
    
       for (i=0;i<d1;i++)
      for (j=0;j<d2;j++)
      {
         ptr[i][j]=(float)i+(float)j;
         printf("ptr[%d][%d]=%f\n",i,j,ptr[i][j]);
      }
      return 0;
    }
    
    int main()
    {
       float **tab = NULL;
       int d1=6,d2=8;
       call_alloc(tab,d1,d2);
       return 0;
    }