Печать строки, созданной в локальной функции

Я понимаю, что проблема с кодом ниже состоит в том, что массив char, в котором хранятся входные данные, находится в локальной функции. Когда указатель на этот массив символов передается основной функции, этот массив символов должен быть удален из стека.

Однако, когда я пытаюсь напечатать строку, она печатается несмотря на предупреждения компилятора. Но если я попытаюсь поместить таймер между вызовом функции и оператором печати, строка будет пустой. Почему это? Является ли "сборка мусора" медленнее, чем оператор print?

Выход без сна:

"Строка - это [строка]"

Выход со сном:

"Строка есть"

#include <stdio.h>
#include <string.h>
#include <unistd.h>

#define MAX 20

char* get_user_input();
int main (){
    char *choice;
    choice = get_user_input();
    //sleep(1);
    //Add sleep and it won't print
    printf("String: %s\n", choice);

}

char* get_user_input( ) {
    char inbuffer[MAX];
    char *pos;
    printf("Enter string>");
    fgets (inbuffer, MAX, stdin);
    pos = strchr( inbuffer, '\n' );
    if ( pos != NULL ){
        *pos = '\0';
    }
    return inbuffer;
}

1 ответ

Решение

Это будет в первую очередь из-за перезаписи стека, рассмотрим:

char* get_user_input( ) {
    char inbuffer[MAX];
    char *pos;
    ...
}

void anotherfunc( ) {
    char a[MAX];
    char *b;
}

int main (){
    char *choice;
    choice = get_user_input();
    anotherfunc();
    printf("String: %s\n", choice);
}

Призыв к anotherfunc будет использовать ту же стековую память, что и get_user_input(), в этом случае на самом деле ничего не записывается в a[] или *b, поэтому ваш * выбор может сохраниться - просто. Если функция имеет какие-либо локальные переменные, которые записаны, недопустимый choice указатель будет указывать на то, что там написано.

Другие вопросы по тегам