Почему функция вызывает это предупреждение компилятора: несовместимый указатель на целочисленное преобразование, возвращающее ‘char[20]’ из функции…

#c

#c

Вопрос:

В чем проблема в этой функции?

 char printThis()
{
    char str[20] = "This is a string";
    return str;
}
  

Я получаю предупреждение: несовместимый указатель на целочисленное преобразование, возвращающее ‘char[20]’ из функции с типом результата char

Ответ №1:

Три проблемы, которые я вижу:

  1. Вы возвращаетесь char* , но функция объявлена для возврата char . Последнее представляет собой всего лишь один символ, а не строку.
  2. Вы пытаетесь вернуть память, которая действительна только для стекового фрейма функции. Это ошибка.
  3. Ваша функция объявлена так, что она может получать любое количество аргументов. Лучше явно объявить, что он не получает none with void .

Исправить так:

 char* printThis(void)
{
    char* str = strdup("This is a string");
    return str;
}
  

Здесь я использую strdup для выделения строки в куче. Если вам действительно нужен буфер длиной 20 символов, вам нужно будет использовать malloc() followed by strcpy() . В любом случае ответственность за освобождение возвращаемой строки передается вызывающей стороне.

Комментарии:

1. Плюс вызывающий должен освободить () строку позже.

Ответ №2:

Думаю, возвращаемый тип должен быть char* , а не char таким:

 char* printThis()
{
    static char str[20] = "This is a string";
    return (char*)str;
}
  

Комментарии:

1. Это возвращает выделенную стеком память.

2. @David, true, исправил это. Но ваше решение кажется лучше, хотя вы должны помнить об освобождении строки

Ответ №3:

вы объявили, что ваша функция возвращает a char , но вы хотите вернуть a char[] , что объясняет ваше предупреждение.

Измените объявление функции на return char*

Кроме того, вы вернете указатель на локально распределенную переменную ( str ), поэтому указатель будет указывать на несуществующую переменную.

Вы должны вручную выделить свою строку, используя malloc или лучше используя strdup , а затем вернуть ее.

Не забудьте free о выделенном указателе!

Strdup : http://pubs.opengroup.org/onlinepubs/007904875/functions/strdup.html

Ответ №4:

Потому char что на самом деле это целочисленный тип и char [] фактически указатель (char *). Измените свое объявление на char * .

Ответ №5:

  • Функция имеет тип char, вы пытаетесь вернуть значение типа char*
  • str — это локально выделенный массив символов. Вы не можете вернуть его, потому что он перестает существовать, когда функция завершается.