c语言的指针问题

comeonstuding 2003-12-16 09:33:03
(1)
请注意下面的指针地址
#include<stdio.h>
void main()
{
int a=5,b,*p,d;
int e;
p=&a;
printf("%x,%x,%x,%x,%x,%x,%x",&a,&b,&p,&d,&e,p,*p);
}
结果:
12ff7c,12ff78,12ff74,12ff70,12ff6c,12ff7c,5Press any key to continue
(2)
请注意下面的地址在释放前后没有改变,是否会带来危害,释放没有吧它制空。
由于没有制空,p还保留了指向的地址,free也不会把指向的地址的值清空。不知
大家可否把它的数据恢复过来。
#include<stdio.h>
#include<stdlib.h>
void main()
{
int *p=(int*)malloc(sizeof(int)*10);
printf("%x,%x\n",&p,p);
free(p);
printf("%x,%x\n",&p,p);
}
结果:
12ff7c,430040
12ff7c,430040
Press any key to continue
(3)
下面代码为什么内存读写出错。而(4)是正确的

int *p=(int*)malloc(sizeof(int)*10);
与int *p,a[10]
p=a;
有什么区别
void main()
{
int *p=(int*)malloc(sizeof(int)*10);
int *q=(int*)malloc(sizeof(int)*10);
for(int i=0;i<10;i++) *p++=1;
for(i=0;i<10;i++) printf("%d",p[i]);
printf("%x,%x\n",&p,p);
free(p);
printf("%x,%x\n",&p,p);



}
(4)可以
void main()
{
int *p=(int*)malloc(sizeof(int)*10);
int *q=(int*)malloc(sizeof(int)*10);
for(int i=0;i<10;i++) p[i]=1;
for(i=0;i<10;i++) printf("%d",p[i]);
printf("%x,%x\n",&p,p);
free(p);
printf("%x,%x\n",&p,p);



}
...全文
72 46 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
46 条回复
切换为时间正序
请发表友善的回复…
发表回复
xmtanglyj 2004-01-12
  • 打赏
  • 举报
回复
学习
boy8765 2004-01-08
  • 打赏
  • 举报
回复
标记
comeonstuding 2003-12-19
  • 打赏
  • 举报
回复
(2003-12-18 21:32:25) 如蚁
我想到了,但不知是否正确
好像函数的入口地址是在编译的时候确定的
而不是在运行的时候实行动态连接的
其实f在编译的时候就用函数的入口地址来代替
这在编译后就不用一个常量来纪录这个值
就像数组一样

[↑]
(2003-12-18 21:32:31) 如蚁
如 int a[10];
a表示数组的首地址,而这个首地址不用4个字节的地址常量来纪录,因为用到a时在编译时就用它的入口
地址来代替。
如 int *p;
p=a;
在编译后 p=((int *)1234454)

[↑]
DePattern 2003-12-19
  • 打赏
  • 举报
回复
mark
chenzhuo 2003-12-18
  • 打赏
  • 举报
回复
下面代码为什么内存读写出错。而(4)是正确的

int *p=(int*)malloc(sizeof(int)*10);
与int *p,a[10]
p=a;
有什么区别
void main()
{
int *p=(int*)malloc(sizeof(int)*10);
int *q=(int*)malloc(sizeof(int)*10);
for(int i=0;i<10;i++) *p++=1; /*这里给P初始化后,指针已经指向10以后的
for(i=0;i<10;i++) printf("%d",p[i]);/*地方了,把*p++改为*(p+i)就OK了
printf("%x,%x\n",&p,p);
free(p);
printf("%x,%x\n",&p,p);
}
comeonstuding 2003-12-18
  • 打赏
  • 举报
回复
附:程序
/*
#include<stdio.h>
typedef int (*FN_HAHA)();
int real_haha()
{
return printf("haha\n");
}

void main(int argc, char* argv[])
{
FN_HAHA haha=real_haha;
real_haha();
(*haha)();
haha();
printf("%x",real_haha);
}
*/
comeonstuding 2003-12-18
  • 打赏
  • 举报
回复
(2003-12-18 20:58:24) 阿奈
f 应该在 code segment
(2003-12-18 20:57:40) 如蚁
但它在编译器中总有一个标识符吧
标识符在最终结果会不会变成一个常量


[↑]
(2003-12-18 20:59:23) 如蚁
比如我刚才发给你的程序中有
FN_HAHA haha=real_haha;
这个real_haha是什么?
是入口地址是的,但它放在那里呢(其中的值)?

[↑]
我们讨论的。做个记号方便总结
birdhuang 2003-12-18
  • 打赏
  • 举报
回复
请注意下面的地址在释放前后没有改变,是否会带来危害,释放没有吧它制空。
由于没有制空,p还保留了指向的地址,free也不会把指向的地址的值清空。不知
大家可否把它的数据恢复过来。

free(p)库函数是否要将p置为null和便宜器有关
标准上没有明确指出 该函数的调用表示将p指向的内存标识为未分配罢了 如果你仍然要使用p中的地址来对*p操作的话 会存在问题的啦

int *p=(int*)malloc(sizeof(int)*10);
与int *p,a[10]
p=a;
有什么区别

malloc(sizeof(int)*10) 表示在heap中来划分单元给你 你要自己来管理他的分配和释放
int a[10] 表示在程序运行栈中划分单元给你 你不用自己来管理他的分配和释放
nwh0008140 2003-12-18
  • 打赏
  • 举报
回复
up
comeonstuding 2003-12-18
  • 打赏
  • 举报
回复
6.指出以下语句中的heap,stack,global data segment

int i;
void f( char c1, char *p )
{
char *c;
c = malloc ( 20 )
//other code
}
其实我是想回答这个问题,我觉的f函数算不算一个
comeonstuding 2003-12-18
  • 打赏
  • 举报
回复
结果忘记贴了
12ff7c,12ff78,12ff74,12ff70,12ff6c,12ff7c,5
42359c,4235a0
4300b0,430080,430050,431ee0,431eb0
401005,40100a,401014,401019
Press any key to continue
comeonstuding 2003-12-18
  • 打赏
  • 举报
回复
(1)的完整版
#include<stdio.h>
#include<stdlib.h>
#include<iostream.h>
int f,g;
int f1(){return 1;};
int f2(){return 1;};
int f3(){int i=1;return 1;};
int f4(){int i=2;return 1;};
void main()
{
int a=5,b,*p,d;
int e;
int *q,*q1,*q2,*q3,*q4;
q=(int*)malloc(sizeof(int));
q1=(int*)malloc(sizeof(int));
q2=(int*)malloc(sizeof(int));
q3=(int*)malloc(sizeof(int));
q4=(int*)malloc(sizeof(int));
p=&a;
printf("%x,%x,%x,%x,%x,%x,%x\n",&a,&b,&p,&d,&e,p,*p);
printf("%x,%x\n",&f,&g);
printf("%x,%x,%x,%x,%x\n",q,q1,q2,q3,q4);
printf("%x,%x,%x,%x\n",f1,f2,f3,f4);
}
abitz 2003-12-18
  • 打赏
  • 举报
回复
这个行。不过个人觉得不大好。
理由还是那个:
调用之后head变成了NULL,这个结果不是谁都能预料到的。
-------------------------
void DeleteList(element &head)
{element next,deleteMe;
deleteMe=head;
while(deleteMe)
{
next=deleteMe->next;
free(deleteMe);
deleteMe=next;
}
head=NULL;
}
suncookie 2003-12-18
  • 打赏
  • 举报
回复
问题3中的问题就在于,指针动态分配的空间,见注释
void main()
{
int *p=(int*)malloc(sizeof(int)*10);
int *q=(int*)malloc(sizeof(int)*10);
for(int i=0;i<10;i++)
*p++=1; //这儿指针的已经位置已经指向了动态分布空间的最后
for(int i=0;i<10;i++)
p--; //加上该for语句可以把指针回到初始位置,即可
for(i=0;i<10;i++)
printf("%d",p[i]);
printf("%x,%x\n",&p,p);
free(p);
printf("%x,%x\n",&p,p);

}
comeonstuding 2003-12-18
  • 打赏
  • 举报
回复
我想这样改
void DeleteList(element &head)
{element next,deleteMe;
deleteMe=head;
while(deleteMe)
{
next=deleteMe->next;
free(deleteMe);
deleteMe=next;
}
head=NULL;
}
不知道可不可以
就不用DeleteList(&head);
comeonstuding 2003-12-17
  • 打赏
  • 举报
回复
(1)的升级版

注意:(1)与(2)的不同
(1)
#include<stdio.h>
#include<stdlib.h>
#include<iostream.h>
int f,g;
void main()
{
int a=5,b,*p,d;
int e;
int *q,*q1,*q2,*q3,*q4;
q=(int*)malloc(sizeof(int));
q1=(int*)malloc(sizeof(int));
q2=(int*)malloc(sizeof(int)*2);
q3=(int*)malloc(sizeof(int)*2);
q4=(int*)malloc(sizeof(int)*10);
p=&a;
printf("%x,%x,%x,%x,%x,%x,%x\n",&a,&b,&p,&d,&e,p,*p);
printf("%x,%x\n",&f,&g);
printf("%x,%x,%x,%x,%x\n",q,q1,q2,q3,q4);

}
12ff7c,12ff78,12ff74,12ff70,12ff6c,12ff7c,5
4235bc,4235c0
430070,430040,431ed0,431e90,431e30
Press any key to continue
(2)
#include<stdio.h>
#include<stdlib.h>
#include<iostream.h>
int f,g;
void main()
{
int a=5,b,*p,d;
int e;
int *q,*q1,*q2,*q3,*q4;
q=(int*)malloc(sizeof(int));
q1=(int*)malloc(sizeof(int));
q2=(int*)malloc(sizeof(int));
q3=(int*)malloc(sizeof(int));
q4=(int*)malloc(sizeof(int));
p=&a;
printf("%x,%x,%x,%x,%x,%x,%x\n",&a,&b,&p,&d,&e,p,*p);
printf("%x,%x\n",&f,&g);
printf("%x,%x,%x,%x,%x\n",q,q1,q2,q3,q4);

}
12ff7c,12ff78,12ff74,12ff70,12ff6c,12ff7c,5
4235bc,4235c0
430070,430040,431ee0,431eb0,431e80
Press any key to continue
abitz 2003-12-17
  • 打赏
  • 举报
回复
偶的结果,比较莫名:
0012FED4,0012FEC8,0012FEBC,0012FEB0,0012FEA4,0012FED4,5
004294E0,004294E4
comeonstuding 2003-12-17
  • 打赏
  • 举报
回复
(1)的改进版
#include<stdio.h>
#include<stdlib.h>
#include<iostream.h>
int f,g;
void main()
{
int a=5,b,*p,d;
int e;
p=&a;
printf("%x,%x,%x,%x,%x,%x,%x\n",&a,&b,&p,&d,&e,p,*p);
printf("%x,%x\n",&f,&g);

}
结果:
12ff7c,12ff78,12ff74,12ff70,12ff6c,12ff7c,5
4235bc,4235c0
Press any key to continue
ralphvsclark 2003-12-17
  • 打赏
  • 举报
回复
指针,它可以指向任何一个内存地址,置空不置空是没有意义的。
例如:int a = 3; int* p = &a; 没有必要 free(p);

只有当 给它分配内存空间之后才要求释放这些内存,已避免造成内存泄漏。
例如: int* p = malloc(sizeof(int) * 10);
free(p);
此时,分配给p的内存已经释放,但p的指向没有改变,因为单纯的让p指向另外一个内存地址是没有意义的。建议释放内存后,将p(p = NULL)指向空地址,以避免后期编程造成的错误引用。因为 C 或者 C++ 编译器很难发现这种错误。
zqsoft79 2003-12-17
  • 打赏
  • 举报
回复
前面两题我没有看懂问题,无法作答,现将3,4两段代码做以下分析
对于第三段代码分析如下:
int *p=(int*)malloc(sizeof(int)*10);
int *q=(int*)malloc(sizeof(int)*10);
     上面对于内存的分配没有问题
________________________________________________________________________
    
for(int i=0;i<10;i++) *p++=1;
     对内存区域的负值也没有问题,但建议改为:
int i = 0;
for(i=0;i<10;i++) *p++=1;
_____________________________________________________________

for(i=0;i<10;i++) printf("%d",p[i]);
这里的指针p已经不是指向分配内存区域的p,准确的说应该是p+i的值
要显示p的值,必须使p回到分配内存区域时的初始值,应改为:
p-=i;
for(i=0;i<10;i++) printf("%d",p[i]);
_____________________________________________________________

printf("%x,%x\n",&p,p);
free(p);
printf("%x,%x\n",&p,p);
这段代码的问题在于:
1、p指针指向的内存区域已经free,应该即时将p指针赋NULL值,以免再次犯野指针的错误。
2、q指针指向的内存区域没有free,已经造成了内存泄漏,应改为:
printf("%x,%x\n",&p,p);
free(p);
     p = NULL
printf("%x,%x\n",&p,p);
free(q);
q = NULL;


不足之处,还望指正
加载更多回复(26)

70,026

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧