Печать строки, созданной в локальной функции
Я понимаю, что проблема с кодом ниже состоит в том, что массив 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
указатель будет указывать на то, что там написано.