Я не могу понять, что не так с моим кодом

char* readString() {

    char* result;
    char line[SIZE];

    if(! fgets(line, sizeof(line), stdin))
        fprintf(stderr, "error\n");

    //printf 1
    printf("line length = %lu\n", strlen(line));

    result = line;

    return result;
}

int main() {

    char* myWord = readString();
    unsigned long len = (unsigned)strlen(myWord);

    //printf 2
    printf("myWord length = %lu\n", len);

    return 0;
} 

Если printf1 и printf2 раскомментированы, я получаю истинную длину. Например, для слова "привет" у меня есть вывод

line length = 6
myWord length = 6

Но если я прокомментирую только printf1, для того же слова "привет" у меня есть

myWord length = 16
1
Valeriy 16 Май 2014 в 18:40

2 ответа

Лучший ответ

Ваш код демонстрирует неопределенное поведение . Вы возвращаете указатель на переменную, объявленную в стеке. В этом случае line или result.

Два возможных исправления включают:

  1. Передайте переменную char line[SIZE]; функции readString().
  2. Выделите память для line в куче с помощью malloc().
8
Bill Lynch 16 Май 2014 в 14:41

Вы возвращаете динамическое значение (выделенный стек), которое удаляется return. Вы должны либо

  • используйте статическую строку, но она не поддерживает ни многопоточность, ни рекурсивность.
  • позвольте вызывающей стороне определить строку как

    char * readstring(char * line, size_t size) {
    // Your stuff
        char * result = fgets(line, size);
    // ...
        return result;
    }
    
1
Serge Ballesta 16 Май 2014 в 15:02