Тип возвращаемой функции и указатели

#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. спасибо, я никогда не люблю получать никаких предупреждений, иногда я быстрее исправляю предупреждения, чем ошибки!