#c #c #pointers
#c #c #указатели
Вопрос:
У меня есть функция, которая будет передавать строку и манипулировать. при вызове функции я передаю строку как таковую, например myfunc ("hello");
В определении функции у меня есть
myfunc (char *array)
{
xxxx
};
Программа работает нормально, но выдает предупреждение «целевые указатели при передаче аргумента 1 ‘myfunc’ отличаются по подписанности».
Как исправить эту проблему?
Комментарии:
1. C или C ? Ответ тот же, но технические детали отличаются.
Ответ №1:
Строки на самом деле являются массивами постоянных символов. То есть тип "hello"
является const char[6]
.
Это означает, что вы не можете ее изменить. Однако из-за глупого преобразования в C массив (в форме строкового литерала) может быть неявно преобразован в неконстантный указатель на первый элемент. Это вводит в заблуждение и опасно. (Действительно, неявное преобразование с удалением константы больше нигде не существует.)
Вы должны убедиться, что вместо этого у вас есть изменяемый буфер:
char buffer[] = "hello";
myfunc(buffer);
Комментарии:
1. Я думаю, предупреждение связано с тем, что компилятор может рассматривать
char
как неподписанный в одной точке и подписанный в другой. Я не очень уверен.2. @Prasoon: О, возможно. (На самом деле я просмотрел вопрос, работая над тем, чтобы стать как можно более ленивым, все еще зарабатывая репутацию. :))
Ответ №2:
Убедитесь, что в вашем определении для myfunc()
функции есть char*
параметр as. Я думаю, что в качестве параметра у него есть unsigned char *. или где-то еще в вашем коде, вы передаете unsigned char*
в качестве аргумента в myfunc(char*)
. Посмотрите на строку предупреждения в вашем коде.
Ответ №3:
Я думаю, что Прасун прав. Ваш компилятор обрабатывает «строковые литералы» как unsigned char
. Просто измените вашу функцию на accept unsigned char
… или измените настройку компилятора, который решает, является ли «строковый литерал» подписанным / неподписанным.
Ответ №4:
что, если вы объявите свою функцию как myfunc (const char *array)