首页 新闻 会员 周边

关于指针的问题

0
悬赏园豆:10 [已解决问题] 解决于 2014-03-14 17:23
int main()
{
        char *str=(char *)malloc(1);
        char *s=(char *)malloc(2);
        printf("%p\n",str);
        printf("%p\n",s);
        strcpy(str,"helloddddddddddddddddddd");
        strcpy(s,"eeeeeeeeeeeeeeeeeeeeeeee");
        printf("%s\n",str);
        return 0;
}

1、请问str和s的地址相差多少?为什么

2、打印结果是什么?为什么

寻找心的巨人的主页 寻找心的巨人 | 菜鸟二级 | 园豆:203
提问于:2014-03-14 15:57
< >
分享
最佳答案
0

你这都内存溢出了,你先把代码写正确来。

收获园豆:10
Launcher | 高人七级 |园豆:45045 | 2014-03-14 16:04

我想知道为什么str和s的地址相差16

寻找心的巨人 | 园豆:203 (菜鸟二级) | 2014-03-14 16:23

@上年的邻居: 不一定是 16.

Launcher | 园豆:45045 (高人七级) | 2014-03-14 16:30

@Launcher: 可是我打印出来都是16啊。

寻找心的巨人 | 园豆:203 (菜鸟二级) | 2014-03-14 16:40

@上年的邻居: 你问问别人机器上打印出来是不是 16 ?

Launcher | 园豆:45045 (高人七级) | 2014-03-14 16:41

@Launcher: 那你电脑打印的是多少

寻找心的巨人 | 园豆:203 (菜鸟二级) | 2014-03-14 16:59

@上年的邻居: 

char *str=(char *)malloc(1);

char *s=(char *)malloc(2);
 
在我的机器上,debug 模式下,str 和 s 相差是 29072,但是只要你在这之前放一条语句,如下:
malloc(1);

 char *str=(char *)malloc(1);

char *s=(char *)malloc(2);
你就会发现每次运行,str 和 s 的地址差值都不一样。
Launcher | 园豆:45045 (高人七级) | 2014-03-14 17:02

@上年的邻居: C/C++ 中没有规定 malloc 分配的地址间有任何逻辑关系,所以请你不要在这条路上钻牛角尖。

Launcher | 园豆:45045 (高人七级) | 2014-03-14 17:04

@Launcher: 我在vc上运行了一下,果然是你说那样。可能是我Linux编译器的问题。能不能解释一下内存溢出的问题?

寻找心的巨人 | 园豆:203 (菜鸟二级) | 2014-03-14 17:14

@上年的邻居: 我以 str 举例:

char *str=(char *)malloc(1); // 你分配了长度为 1 的内存

strcpy(str,"helloddddddddddddddddddd");  // 将长度为 24 的数据拷贝到长度为 1 的缓冲区内,越界了!!!!! str 只有 1 个字节大小,你却给它填充了 24 个字节,str+1 地址后的内存可能存放了其它的数据,你给它覆盖了。

 

Launcher | 园豆:45045 (高人七级) | 2014-03-14 17:18

@上年的邻居: 

printf("%s\n",str);  // 从 str 开始输出,直到遇到 '\0' 停止。你又越界了,str 只有 1 个字节,从第几个字节开始会遇到 '\0' 是未知的,它可能会输出其它的数据。

Launcher | 园豆:45045 (高人七级) | 2014-03-14 17:20

@Launcher: 非常感谢

寻找心的巨人 | 园豆:203 (菜鸟二级) | 2014-03-14 17:21
其他回答(1)
0

顶楼上,槽点太多不知道怎么吐槽了

吴瑞祥 | 园豆:29449 (高人七级) | 2014-03-14 16:24

写这个程序只是想证明自己心中的疑问

支持(0) 反对(0) 寻找心的巨人 | 园豆:203 (菜鸟二级) | 2014-03-14 16:44

@上年的邻居: 你想证明啥?证明 malloc(1)和 malloc(2) 之间的差一定是 16 ?

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2014-03-14 16:47

@Launcher: 我就是不明白才问的,不然你把它的输出结果解释一下

支持(0) 反对(0) 寻找心的巨人 | 园豆:203 (菜鸟二级) | 2014-03-14 16:56

@上年的邻居: 跟你说了不一定是 16。你后面的语句都越界访问内存了。

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2014-03-14 16:58

@上年的邻居: 

 char *str=(char *)malloc(1);

char *s=(char *)malloc(2);
 
在我的机器上,debug 模式下,str 和 s 相差是 29072,但是只要你在这之前放一条语句,如下:
malloc(1);

 char *str=(char *)malloc(1);

char *s=(char *)malloc(2);
你就会发现每次运行,str 和 s 的地址差值都不一样。
支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2014-03-14 17:02
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册