Re: pass a local variable to a function

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Mar 25, 2009 at 9:21 AM, 明亮 <longapple@xxxxxxxxx> wrote:
> Hi guys,
>
> This is my first email in this list, any help is much appreciated.
> As I know, it's not allowed to pass a local variable to a function,
> because the stack where local variable resides will be reused by other
> functions.
> eg:
>      1  #include <stdio.h>
>      2
>      3  char *fetch();
>      4
>      5  int main(int argc, char *argv[]){
>      6          char *string;
>      7          string = fetch();
>      8          printf("%s\n", string);
>      9          exit(0);
>     10  }
>     11
>     12  char *fetch(){
>     13          char string[10];
>     14          scanf("%s", string);
>     15          return string;
>     16  }
>
> When the application is executed, after input "a", it will produce
> unknown characters, like "8Šè¿ôÿO". Which is like what I expect
>
> However, if I change line 13 to:
>     13           char string[1024];
>
> When I type "a", it echos "a", which is out of my expectation
>
> Why does it behave like this?
>
> Thanks in advance,
> longapple

The data for string[] is being destroyed by the call to printf (first
thing you call after fetch). On your particular system making it 1024
puts it out of reach of printf's call frame. your stack is probably
growing downwards, so the call frame of printf is ending up near the
end of what string[] used to be. If you fill your string[] with memset
of 'a' and leave not null terminated, you can easily see the point
where your data ends and the next function starts to clobber you.

-- 
Jon Mayo
<jon.mayo@xxxxxxxxx>
--
To unsubscribe from this list: send the line "unsubscribe linux-c-programming" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Assembler]     [Git]     [Kernel List]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [C Programming]     [Yosemite Campsites]     [Yosemite News]     [GCC Help]

  Powered by Linux