打印在本地函数中创建的字符串

时间:2014-03-07 18:38:20

标签: c arrays memory-management buffer local

我理解下面代码的问题是存储输入的char数组是在本地函数中。当指向该char数组的指针传递给main函数时,应该从堆栈中删除该char数组。

但是,当我尝试打印字符串时,尽管编译器警告,它仍会打印。但是如果我尝试在函数调用和print语句之间放置一个计时器,则字符串为空。 为什么是这样? “垃圾收集”是否比打印语句慢?

没有睡眠的输出:

  

“String is [string]”

睡眠输出:

  

“字符串是”

#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 个答案:

答案 0 :(得分: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()相同的堆栈内存,在这种情况下,实际上没有任何内容写入[]或* b,因此您的*选择可能会持续存在 - 只是。如果一个函数有任何写入的局部变量,则无效的choice指针将指向那里写的任何内容。