C - Назначение делает целое число из указателя без приведения - PullRequest
0 голосов
/ 19 октября 2018

У меня есть этот фрагмент кода из моей программы:

typedef struct board_t{
   int x_pos;                 
   int y_pos;
   int size;
   int counter;        
   int** field;
};

int func(struct board_t* b){

[...]

int i;
for(i=b->size; i>=1; i--){    
    int y;
    for(y=b->size; y>=b->size; y--){
        b->field[i][y] = (int*)malloc(sizeof(int));   //warning here
        if(b->field[i][y] == NULL){
            printf("Failed to save memory...");
            return 1;
        }
    }
 }
}

поле является двумерным массивом типа double-pointer.Теперь я получаю предупреждение "назначение делает целое число из указателя без приведения".Может ли кто-нибудь объяснить мне это и как это исправить?

1 Ответ

0 голосов
/ 19 октября 2018

Этот код неправильно выделяет пространство для массива.

Когда вы пытаетесь присвоить b->field[i][y], есть две проблемы с этим.Во-первых, это поле имеет тип int, но вы пытаетесь присвоить ему указатель.Вот откуда приходит предупреждение.Во-вторых, field еще нигде не указывает, поэтому field[i] разыменовывает неинициализированный указатель.Вы не можете сделать это, пока вы сначала не назначите что-то для field.

Что вам нужно сделать, это выделить пространство для массива int * и назначить его для field (первое измерение),затем для каждого члена массива выделите место для массива int и назначьте его каждому члену (второе измерение):

int i;
b->field = malloc(b->size * sizeof(*b->field));
if (!b->field) {
    perror("malloc failed");
    exit(1);
}
for (i=0; i<b->size; i++) {
    b->field[i] = malloc(b->size * sizeof(**b->field));
    if (!b->field[i]) {
        perror("malloc failed");
        exit(1);
    }
}
...