#c
#c
Вопрос:
В чем проблема в этой функции?
char printThis()
{
char str[20] = "This is a string";
return str;
}
Я получаю предупреждение: несовместимый указатель на целочисленное преобразование, возвращающее ‘char[20]’ из функции с типом результата char
Ответ №1:
Три проблемы, которые я вижу:
- Вы возвращаетесь
char*
, но функция объявлена для возвратаchar
. Последнее представляет собой всего лишь один символ, а не строку. - Вы пытаетесь вернуть память, которая действительна только для стекового фрейма функции. Это ошибка.
- Ваша функция объявлена так, что она может получать любое количество аргументов. Лучше явно объявить, что он не получает 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 — это локально выделенный массив символов. Вы не можете вернуть его, потому что он перестает существовать, когда функция завершается.