#c #pointers
#c #указатели
Вопрос:
У меня возникли некоторые проблемы с типами возвращаемой функции и указателями (извините, если это глупый вопрос, но я уже довольно давно не программировал C). Когда я запускаю это:
#include <stdio.h>
#include <string.h>
#include <strings.h>
char *parse(char const *data) {
return data;
}
int main(int argc, const char *argv[]) {
char *a = "# Test";
char newString = parse(a);
printf("%sn", amp;newString);
return 0;
}
Я получаю сообщение об ошибке:
writer.c: In function ‘parse’: writer.c:6: warning: return from incompatible pointer type
writer.c:6: warning: function returns address of local variable writer.c: In function ‘main’:
writer.c:11: warning: initialization makes integer from pointer without a cast
Есть идеи?
Ответ №1:
parse(a)
возвращает char*
, а newString — это тип char
, поэтому они несовместимы.
Измените это:
char newString = parse(a);
printf("%sn", amp;newString);
к этому:
char *newString = parse(a);
printf("%sn", newString);
Что касается ваших ошибок / предупреждений:
writer.c: В функции ‘parse’: writer.c:6: предупреждение: возврат из несовместимого типа указателя
Вы возвращаете, const char*
в то время как тип возвращаемой функции равен char*
writer.c:6: предупреждение: функция возвращает адрес локальной переменной writer.c: В функции
данные считаются локальной переменной, и вы возвращаете этот адрес, который мог бы быть опасным, если бы он был определен внутри функции.
‘main’: writer.c:11: предупреждение: инициализация преобразует целое число из указателя без приведения
Вы присваиваете char*
a char
.
И в качестве дополнительного примечания: когда вы используете указатель char на постоянную строку, сделайте его const: const char *a = "# Test";
Комментарии:
1. Спасибо! но я все еще получаю ошибку:
writer.c: In function ‘parse’: writer.c:6: warning: return discards qualifiers from pointer target type
2. смотрите редактирование. Я думаю, вы найдете это полезным, кроме того, предупреждение не является ошибкой, но здорово, что вы относитесь к нему как к таковому 🙂
3. спасибо, я никогда не люблю получать никаких предупреждений, иногда я быстрее исправляю предупреждения, чем ошибки!