簡體   English   中英

代碼在c上崩潰,很可能與malloc有關?

[英]Code crashes on c, most likely something to do with 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;
}

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雙打。

代碼在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;
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM