# Ch07 Process Environment >###### tags: `APUE` `C basics` ### Potential Problem with Automatic Variable ```c= #include <stdio.h> #include <stdlib.h> #define Datafile "data.txt" #define buffer_size 100 FILE* open_data(void){ FILE* fp; char data_buffer[buffer_size]; if ((fp = fopen(Datafile,"r")) == NULL) return NULL; if (setvbuf(fp,data_buffer,_IOLBF,buffer_size) != 0) return NULL; printf("fp = %p\n",fp); int file_len = 0; fseek(fp,0,SEEK_END); file_len = ftell(fp); fseek(fp,0,SEEK_SET); printf("file length %d\n",file_len); return fp; } ``` The basic rule is that an automatic variable can never be referenced after the function that declared it returns.The above code shows a function called open_data that opens a standard I/O stream and sets the buffering for the stream. The problem is that when open_data returns, the space it used on the stack will be used by the stack frame for the next function that is called. But the standard I/O library will still be using that portion of memory for its stream buffer.Chaos is sure to result. To correct this problem, **the array databuf needs to be allocated from global memory,either statically (static or extern) or dynamically (one of the alloc functions).**