предупреждение при передаче строки в функции c

#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)