Разбирам, че проблемът с кода по-долу е, че масивът char, където се съхранява входът, е в локална функция. Когато указателят към този char масив бъде предаден на основната функция, този char масив трябва да бъде изтрит от стека.
Въпреки това, когато се опитам да отпечатам низа, той се отпечатва въпреки предупрежденията на компилатора. Но ако се опитам да поставя таймер между извикването на функцията и оператора за печат, низът е празен. Защо е това? „Събирането на боклука“ по-бавно ли е от отчета за печат?
Изход без заспиване:
„Низът е [низ]“
Изход със съня:
"Низът е"
#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;
}
sleep
да презапише вашия стек и да повреди низа. (Това обаче не обяснява защоprintf
го оставя непокътнат.) - person M Oehm   schedule 07.03.2014