предупреждение: присваивание делает целое число из указателя без приведения - PullRequest
24 голосов
/ 25 февраля 2011

Когда я объявляю char * для фиксированной строки и повторно использую указатель, чтобы указать на другую строку

/* initial declaration */
char *src = "abcdefghijklmnop";
.....

/* I get the   "warning: assignment makes integer from pointer without a cast" */
*src ="anotherstring";

Я попытался изменить указатель, но безуспешно.

Ответы [ 4 ]

31 голосов
/ 25 февраля 2011

Выражение *src относится к первому символу в строке, а не ко всей строке. Чтобы переназначить src для указания на другую строку tgt, используйте src = tgt;.

29 голосов
/ 26 февраля 2011

Когда вы пишете оператор

*src = "anotherstring";

, компилятор видит постоянную строку "abcdefghijklmnop" как массив.Представьте, что вместо этого вы написали следующий код:

char otherstring[14] = "anotherstring";
...
*src = otherstring;

Теперь немного яснее, что происходит.Левая сторона, *src, относится к char (поскольку src имеет тип указатель на char), тогда как правая сторона, otherstring, относится к указателю.*

Это не строго запрещено, поскольку вы можете сохранить адрес, на который указывает указатель.Тем не менее, в этом случае обычно используется явное приведение (что не так часто встречается).Компилятор выдает красный флаг, потому что ваш код, вероятно, не выполняет то, о чем вы думаете.

Мне кажется, что вы пытаетесь назначить строку.Строки в C не являются типами данных, как в C ++, и вместо этого реализуются с массивами char.Вы не можете напрямую присвоить значения строке, как вы пытаетесь сделать.Вместо этого вам нужно использовать такие функции, как strncpy и друзья из <string.h> и использовать char массивы вместо char указателей.Если вы просто хотите, чтобы указатель указывал на другую статическую строку, тогда отбросьте *.

5 голосов
/ 26 февраля 2011

Предупреждение исходит из того факта, что вы разыменовываете src в задании.Выражение *src имеет тип char, который является целым типом.Выражение "anotherstring" имеет тип char [14], который в данном конкретном контексте неявно преобразуется в тип char *, и его значением является адрес первого символа в массиве.Итак, вы пытаетесь присвоить значение указателя целочисленному типу, отсюда и предупреждение.Удалите * из *src, и оно должно работать как положено:

src = "anotherstring";

, поскольку тип src равен char *.

0 голосов
/ 25 февраля 2011

То, что сказал Иеремия, плюс компилятор выдает предупреждение, потому что производство: *src ="anotherstring";

говорит: возьмите адрес "anotherstring" - "anotherstring" - это указатель на символ - и сохраните этот указатель косвенно через src (* src = ...) в первый символ строки "abcdef ... «Предупреждение может сбить с толку, потому что в вашем коде нет ни одного упоминания о каком-либо целом числе: предупреждение кажется бессмысленным. Но за кулисами скрывается правило, что «int» и «char» являются синонимами с точки зрения хранения: оба занимают одинаковое количество битов. Компилятор не различает, когда выдает предупреждение, что вы сохраняете в целое число. Что, кстати, совершенно нормально и законно, но, вероятно, не совсем то, что вы хотите в этом коде.

- Пит

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