回 帖 发 新 帖 刷新版面

主题:看看你的结果是什么了


//输入并编译下面的程序
//看看你得到的结果是什么

//回帖者请注明你得到的结果
//和使用的编译器以及版本
//还有采用的平台 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个回复)

沙发

不崩就不错了,除非你想研究溢出攻击,否则没啥意义~~~~

板凳

这东东对于不同的编译选项也会有不同的反应。
一般说来会是这样的处理:
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 楼

[quote]此时程序有可能会崩溃。(肚子饿了,有空再详细分析:)[/quote]
呵,研究固然重要,但要注意身体啊,不要忘记按时就餐。

4 楼

[quote][quote]此时程序有可能会崩溃。(肚子饿了,有空再详细分析:)[/quote]呵,研究固然重要,但要注意身体啊,不要忘记按时就餐。[/quote]嘿嘿,所以我吃饭去了,回来就把我想说的事儿忘了~~~~

我来回复

您尚未登录,请登录后再回复。点此登录或注册