присвоение из несовместимого указателя типа C - PullRequest
2 голосов
/ 11 мая 2011

Скажите, что я хочу прочитать в списке страниц имя макс 19 символов, например 4 (Номер страницы) Имя1 Имя2 Имя3 Name4

Я пытаюсь использовать глобальный 2D массив сохранить номер страницы и страницу имя, я получил ошибку, говоря назначение из несовместимого типа указателя ...

Спасибо

static int nPages;
static char** pageName;

int main(void){
  scanf(" %d", &nPages);

  pageName = (char *)malloc(nPages*sizeof(char));
  for(int i=0; i < nPages ;i++){
    pageName[i] = (char *)malloc(20*sizeof(char));
    scanf(" %s", pageName[i]);
  }

//Free Memory Here of coz. 

  return 0;
}

Ответы [ 5 ]

5 голосов
/ 11 мая 2011

Никогда не приводите возвращаемое значение malloc() в C . Он скрывает предупреждения компилятора, которые действительно вам помогают, и в этом нет необходимости, поэтому он просто добавляет беспорядок. Вы должны использовать:

pageName = malloc(nPages * sizeof *pageName);

Обратите внимание, как это свободно от повторений имени типа pageName. Здесь sizeof *pageName означает «размер объекта, на который указывает pageName», то есть «размер указателя символа». Вы должны ожидать sizeof выражение в качестве аргумента malloc() очень часто.

Кроме того, sizeof (char) всегда равен 1 в C, так что конкретное выражение, можно утверждать, добавляет больше беспорядка, чем помогает сделать код безопасным.

3 голосов
/ 11 мая 2011

Проблема заключается в следующем:

pageName = (char *)malloc(nPages*sizeof(char));

pageName - это char **, а не char *.Таким образом, оно должно выглядеть следующим образом:

pageName = malloc(nPages*sizeof(char*)); // sizeof(char *), and no need to cast

РЕДАКТИРОВАТЬ: удалено приведение

0 голосов
/ 11 мая 2011

char* и char** - это два разных типа, и вы не можете свободно назначать первое последнему.

Сказав это, вы должны выполнить двухэтапную инициализацию. Во-первых, вам нужно malloc() пробел для nPages строки:

pageName = (char**) malloc(nPages * sizeof(char*));

тогда вам нужно malloc() пробел для каждого pageName:

for (i = 0; i < nPages; ++i) {
    pageName[i] = (char*) malloc(20);
}
0 голосов
/ 11 мая 2011

Вы присваиваете char* для char** в первой malloc строке.Просто бросьте (char*) cast - C автоматически обрабатывает преобразование void* в char**.

0 голосов
/ 11 мая 2011

Вы определили pageName как char **, но при вызове malloc для инициализации указателя вы используете приведение к (char *). Может быть, в этом проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...