代码在c上崩溃,很可能与malloc有关?

时间:2016-12-27 23:40:28

标签: c memory crash malloc

这是非常基本的,但我一直试图解决它几个小时,但没有成功。该代码应该从用户输入读取3个int,然后根据int(n =多少,d =维度,k与此部分无关)指向并创建它们的数组。由于某种原因,它在第二个循环中崩溃,它无法创建第二个点,但我不知道为什么。我认为它可能与malloc有关,但我完全迷失了,不胜感激任何帮助。

我插入了输入:

5 3 2 
1.2 3.4 0.1

坠毁前2次。

代码如下:

int main(){

    double* pdata;
    int n,d,k;
    scanf("%d %d %d",&n,&d,&k );
    SPPoint*  parr [n];
    for(int i=0; i<n; i++)
    {
        double darr [d];
        for(int j = 0; j < d-1; j++)
        {
            scanf(" %lf", &darr[j]);
        }
        scanf(" %lf", &darr[d-1]);
    pdata = darr;
    parr[i] = spPointCreate(pdata, d, i); 
    }
}

这是spPointCreate函数的代码:

struct sp_point_t{
double* data;
int dim;
int index;
};

SPPoint* spPointCreate(double* data, int dim, int index){
SPPoint* point = malloc(sizeof(SPPoint*));
if(point == NULL)
{
    return NULL;
}
point->data = (double*) malloc(sizeof(data));
for( int i=0 ; i<dim ; i++)
{
    point->data[i] = data[i];
}
point->dim = dim;
point->index = index;
return point;
}

2 个答案:

答案 0 :(得分:3)

  

SPPoint* point = malloc(sizeof(SPPoint*));

应该是:struct SPPoint* point = malloc(sizeof(*point));

  

point->data = (double*) malloc(sizeof(data));

应为point->data = malloc(dim * sizeof(*point->data)); 因为你想为你的观点分配dim双打。

答案 1 :(得分:1)

代码在2个地方错误分配

// Bad
SPPoint* spPointCreate(double* data, int dim, int index){
  SPPoint* point = malloc(sizeof(SPPoint*));  // allocate the size of a pointer
  ...
  point->data = (double*) malloc(sizeof(data)); // allocate the size of a pointer

相反,避免错误编码类型并分配到去引用变量的大小。

还需要分配N个对象。

SPPoint* spPointCreate(double* data, int dim, int index){
  size_t N = 1;
  SPPoint* point = malloc(sizeof *point * N);// allocate the size of `*point` * N

  ...
  assert(dim >= 0);
  N = dim;
  point->data = malloc(sizeof *(point->data) * N);

BTW,不需要投射malloc()的结果。

第二次分配将受益于NULL检查。更复杂的是,dim可能为0,malloc()返回NULL就好了。

  N = dim;
  point->data = malloc(sizeof *(point->data) * N);
  if (point->data == NULL && N > 0) {
    free(point);
    return NULL;
  }