当前位置: 技术问答>linux和unix
指针 函数 专家请进
来源: 互联网 发布时间:2016-10-27
本文导语: 一个同学问到的发现自己也有点模糊不清,返回结果是前面为随机值,后面可以打印,用gdb调试发现在打印的时候有问题,返回到ret都是有值的,请大家能够解答,另附汇编。 1 #include 2 3 char *mytest(){...
一个同学问到的发现自己也有点模糊不清,返回结果是前面为随机值,后面可以打印,用gdb调试发现在打印的时候有问题,返回到ret都是有值的,请大家能够解答,另附汇编。
1 #include
2
3 char *mytest(){ char str[]="qwer"; return str;}
4
5 char *mytest1(){char *str="qwer"; return str;}
6 int main(void)
7 {
8 char *ret;
9 ret = mytest();
10 printf("string=%sn",ret);
11 ret = mytest1();
12 printf("string=%sn",ret);
13 return 1;
14 }
1 .file "main.c"
2 .text
3 .globl mytest
4 .type mytest, @function
5 mytest:
6 pushl %ebp
7 movl %esp, %ebp
8 subl $16, %esp
9 movl $1919252337, -5(%ebp)
10 movb $0, -1(%ebp)
11 leal -5(%ebp), %eax
12 leave
13 ret
14 .size mytest, .-mytest
15 .section .rodata
16 .LC0:
17 .string "qwer"
18 .text
19 .globl mytest1
20 .type mytest1, @function
21 mytest1:
22 pushl %ebp
23 movl %esp, %ebp
24 subl $16, %esp
25 movl $.LC0, -4(%ebp)
26 movl -4(%ebp), %eax
27 leave
28 ret
29 .size mytest1, .-mytest1
30 .section .rodata
31 .LC1:
32 .string "string=%sn"
33 .text
34 .globl main
35 .type main, @function
36 main:
37 pushl %ebp
38 movl %esp, %ebp
39 andl $-16, %esp
40 subl $32, %esp
41 call mytest
42 movl %eax, 28(%esp)
43 movl $.LC1, %eax
44 movl 28(%esp), %edx
45 movl %edx, 4(%esp)
46 movl %eax, (%esp)
47 call printf
48 call mytest1
49 movl %eax, 28(%esp)
50 movl $.LC1, %eax
51 movl 28(%esp), %edx
52 movl %edx, 4(%esp)
53 movl %eax, (%esp)
54 call printf
55 movl $1, %eax
56 leave
57 ret
58 .size main, .-main
59 .ident "GCC: (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5"
60 .section .note.GNU-stack,"",@progbits
|
char *mytest(){ char str[]="qwer"; return str;}
--这种是错误的,str是一个局部变量,函数返回时空间释放,因此地址不再有效,输出内容是随机的。
char *mytest1(){char *str="qwer"; return str;}
这种是正确的,str是一个指针,指向存放于常量区的"qwer",这个地址在整个程序的生命周期都是有效的。
--这种是错误的,str是一个局部变量,函数返回时空间释放,因此地址不再有效,输出内容是随机的。
char *mytest1(){char *str="qwer"; return str;}
这种是正确的,str是一个指针,指向存放于常量区的"qwer",这个地址在整个程序的生命周期都是有效的。
|
46 movl %eax, (%esp) ///应该这个会覆盖才对吧,这时的esp应该和前面的-5(%ebp)的地址是交叉的。。。printf里面也可能再次覆盖的
47 call printf
47 call printf