主题:看看你的结果是什么了
pusheax
[专家分:0] 发布于 2011-05-09 12:58:00
//输入并编译下面的程序
//看看你得到的结果是什么
//回帖者请注明你得到的结果
//和使用的编译器以及版本
//还有采用的平台 WIN/LINUX
#include <stdio.h>
main()
{
char c1[4]="abcd";
char c2[8]="hijklmn";
char c3[5]="opqrs";
char *p1;
char *p2;
char *p3;
char **c;
p1=&c1;
p2=&c2;
p3=&c3;
c=&p1;
printf("c is %s\n",*c);
}
回复列表 (共4个回复)
沙发
cgl_lgs [专家分:21040] 发布于 2011-05-09 14:22:00
不崩就不错了,除非你想研究溢出攻击,否则没啥意义~~~~
板凳
cgl_lgs [专家分:21040] 发布于 2011-05-10 12:27:00
这东东对于不同的编译选项也会有不同的反应。
一般说来会是这样的处理:
1、编译器将栈中数据按从前到后的方式存储,则栈内数据为:
a)设编译选项中栈按4字节对齐:
abcd
hijk
lmn\0
opqr
s\0<填充><填充>
……
此时输出的结果是:abcdhijklmn
b)设编译选项中栈按8字节对齐
abcd<填充><填充><填充><填充>
hijklmn\0<填充><填充><填充>
……
如果空白填充正好是0,此时输出结果则是:abcd
否则可能会看到一堆不确定的东西。
2、编译器将栈中数据按从后往前的方式存储,则栈内数据为:
opqrs
hijlmn\0
abcd
此时编译器除输出abcd外,可能还会输出函数返回地址对应的字符或是怪符
3、编译器将常量字符串存在STATIC区,进入函数后现COPY
此时程序有可能会崩溃。(肚子饿了,有空再详细分析:)
3 楼
windy0will [专家分:2300] 发布于 2011-05-11 09:16:00
[quote]此时程序有可能会崩溃。(肚子饿了,有空再详细分析:)[/quote]
呵,研究固然重要,但要注意身体啊,不要忘记按时就餐。
4 楼
cgl_lgs [专家分:21040] 发布于 2011-05-11 10:26:00
[quote][quote]此时程序有可能会崩溃。(肚子饿了,有空再详细分析:)[/quote]呵,研究固然重要,但要注意身体啊,不要忘记按时就餐。[/quote]嘿嘿,所以我吃饭去了,回来就把我想说的事儿忘了~~~~
我来回复