2016-12-27 6 views
3

Это довольно простой, но я пытался решить его в течение нескольких часов без успеха. Этот код должен читать 3 ввода с пользовательского ввода, а затем, точки в соответствии с ints (n = сколько, d = размерность, k не имеет отношения к этой части) и создать их массив. По какой-то причине он выходит из строя во втором цикле, где ему не удается создать вторую точку, но я не уверен, почему. Я думаю, что это может иметь какое-то отношение к malloc, но я полностью потерян, буду признателен за любую помощь.Код падает на c, скорее всего, что-то связано с 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; 
} 
+1

Неверный размер. 'SPPoint * point = malloc (sizeof (SPPoint *));' -> 'SPPoint * point = malloc (sizeof * point);' То же самое для 'point-> data = malloc (sizeof * (point-> data)) ; ' – chux

+0

Спасибо большое, похоже, сейчас работает! – Gray

+0

Существуют и другие проблемы. – chux

ответ

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 двойников для точки.

+0

Исправлено первое. Что касается второго, массив данных, присвоенный функции, имеет размер dim. – Gray

+0

Не позволю мне отредактировать: Исправлено первое. Что касается второго, массив данных, присвоенный функции, имеет размер dim. Я думаю, point-> data = malloc (dim * sizeof (double)); это то, о чем вы думали? Спасибо за ответ – Gray

+0

@Bar да, это он. Вы должны выделить 'dim' doubles –

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() не требуется.

2-е распределение выиграло бы с проверкой NULL. Более сложным, так как dim может быть 0, а malloc() возврат NULL в этом случае в порядке.

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