C: Предупреждение: присваивание делает указатель из целого числа без приведения [включено по умолчанию] - PullRequest
0 голосов
/ 17 декабря 2018

Немного новичок в C, и был озадачен этим предупреждением, которое я получаю в этой функции:

void fillPrioritiesArr(int ** priorities, int arrSize) { 
  int currIdx = 0;
  while(currIdx < arrSize){
    priorities[currIdx]=malloc(sizeof(int));
    priorities[currIdx] = (int) rand() % 10;
    currIdx++;
  }
}

В частности, эта строка:

priorities[currIdx] = (int) rand() % 10;

Это связано с тем, чтоодна переменная-указатель, а другая int?Или мое понимание этого совершенно неверно?

Ответы [ 3 ]

0 голосов
/ 17 декабря 2018

попробуйте

void fillPrioritiesArr(int ** priorities, int arrSize) { 
  int currIdx = 0;
  while(currIdx < arrSize){
    priorities[currIdx]=malloc(sizeof(int));
    *priorities[currIdx] = (int) rand() % 10;
    currIdx++;
  }
}
0 голосов
/ 17 декабря 2018

В строке

priorities[currIdx] = (int) rand() % 10;

вы пытаетесь присвоить int на правой стороне (rhs) = чему-то, что имеет тип int* налевая сторона (лс).Lhs - это переменная, которая содержит указатель на место хранения, где вы можете хранить int.Итак, чтобы записать в это место, вы должны сначала разыменовать переменную указателя с помощью *priorities[currIdx].Это говорит компилятору: «Не пишите в саму переменную, а ищите место, куда она указывает, и пишите туда».

Это похоже на то, что вы делаете, когда вначале говорите priorities[currIdx],Переменная priorities является int**.Это указатель на указатель на int.Вы не хотите переопределять саму переменную, но хотите записать местоположение, на которое она указывает (имеет тип int*), со свежим указателем.В этом случае вы разыменовываете высказывание priorities[currIdx], что эквивалентно *(priorities + currIdx).


Однако выделение дополнительного int для каждого слота массива не только неоправданно и громоздко, но и делаетВаш код намного медленнее.Вы можете получить массив int s напрямую, просто передав int* priorities. Затем вы можете просто удалить строку malloc и записать в массив, как вы делали в своем вопросе изначально.То есть без разыменования:

priorities[currIdx] = (int) rand() % 10;

, поскольку priorities[currIdx] будет иметь тип int.

0 голосов
/ 17 декабря 2018

priorities [currIdx] имеет тип целочисленного указателя.Вы не можете присвоить int адресу.

Сделайте это:

int temp = (int) rand()%10;

memcpy(priorities [currIdx], &temp, sizeof(int);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...