注册 登录
编程论坛 C++教室

malloc函数 请解释一下!

雪色朝阳 发布于 2010-03-26 17:12, 833 次点击
#include<stdlib.h>
main()
{
char *p,*q;
p=(char*)malloc(sizeof(char)*20);q=p;
scanf("%s%s",p,q);printf("%s%s\n",p,q);
}

从键盘输入abc def<回车>,则输出结果是多少?(答案是def def)为什么?

请帮忙解释一下红色部分!谢谢!
9 回复
#2
秀痘魔导士2010-03-26 17:19
分配20个char大小的堆空间
p,q指向相同的地址空间,如果你想输出abc def,这么写

#include<stdlib.h>
#include<stdio.h>
int main()
{
    char *p,*q;
    p=(char*)malloc(sizeof(char)*20);
    q=(char*)malloc(sizeof(char)*20);
    scanf("%s%s",p,q);
    printf("%s%s\n",p,q);
    free(p);
    free(q);
}
#3
书呆2010-03-26 17:21
p=(char*)malloc(sizeof(char)*20);// 分配20个字节的存储空间,p指向空间的首地址
q=p;// q也指向空间的首地址
scanf("%s%s",p,q);// 输入abc def,因为p,q指向的地址相同,所以abc被def覆盖
#4
雪色朝阳2010-03-26 17:41
回复 3楼 书呆
为什么abc会被def所覆盖呢,而不是def被abc所覆盖呢?
#5
秀痘魔导士2010-03-26 17:42
以下是引用雪色朝阳在2010-3-26 17:41:00的发言:

为什么abc会被def所覆盖呢,而不是def被abc所覆盖呢?
后输入的覆盖先前输入的
#6
雪色朝阳2010-03-26 17:45
回复 5楼 秀痘魔导士
那能不能使前输入的覆盖后输入的呢?比如说输出的是abcabc
#7
evilperfect2010-03-26 21:36
回复 6楼 雪色朝阳
scanf("%s%s",p,q);
你先在这个地方放了个苹果,然后在相同的地方放了个梨子,试问你可以伸手拿到的是苹果还是梨子?
#8
apull2010-03-26 22:14
以下是引用evilperfect在2010-3-26 21:36:38的发言:

scanf("%s%s",p,q);
你先在这个地方放了个苹果,然后在相同的地方放了个梨子,试问你可以伸手拿到的是苹果还是梨子?
说的不错。
都是对同一个内存地址赋值。
#9
mghxz2522010-03-27 11:49
又学会了一个,谢谢大家。
#10
drhp1232010-03-30 23:01
我觉得,p=q说明他们公用同一块内存空间,先放abc,内存中是abc,然后放入def,则内容变了,输出其实是两次输出同一地址中的内容.
1