Подтвердить что ты не робот

Warning: присваивание делает целое число из указателя без приведения

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

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

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

Я попытался переделать указатель, но не успел.

4b9b3361

Ответ 1

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

Ответ 2

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

*src = "anotherstring";

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

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

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

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

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

Ответ 3

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

src = "anotherstring";

так как тип src равен char *.

Ответ 4

Что сказал Иеремия, плюс компилятор выдает предупреждение, потому что производство:

*src ="anotherstring";

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

- pete