糊涂了 这样对吗?

peter9606 2005-01-19 09:42:51
#include<malloc.h>
#include<string.h>
int main()
{

typedef unsigned char (*T)[8] ;
T a ;
a = (T)malloc(2*sizeof(T)) ;
memcpy(a[0],"1234567",8) ;
memcpy(a[1],"ABCDEFG",8) ;
printf("%s\n",a[0]);
printf("%s\n",a[1]);

return 0;
}
...全文
183 点赞 收藏 32
写回复
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
peter9606 2005-01-19
呵呵 谢谢大家
不懂就问,不懂的明白了不就好了?
:)
回复
piaozi2003 2005-01-19
丢脸!
回复
lovefly_fanny 2005-01-19
还是老迈深刻啊
···我的理解也有点问题
回复
lovefly_fanny 2005-01-19
typedef unsigned char (*T)[8] ;
T a ;
a = (T)malloc(2*sizeof(T)) ;// a只有八个字节,两个指针的大小
memcpy(a[0],"1234567",8) ;//有问题,a[0]没有相应的内存
memcpy(a[1],"ABCDEFG",8) ;//有问题···a[1]也没有
怎么看怎么不对啊·········
回复
laomai 2005-01-19
呵呵,上面已经有兄弟说了啊。其实这个没什么难理解的。
typedef unsigned char (*T)[8] ;
//这里本质上还是定义了一个指针类型,其类型大小在32位系统还是4
T a ;

a = (T)malloc(2*sizeof(T))
//所以分配的时候a得到的空间是2*4=8个。

memcpy(a[0],"1234567",8) ; //因此,这条语句没有越界
memcpy(a[1],"ABCDEFG",8) ;
//注意a[1]的计算方式,由于a指向的类型是一个元素个数为8的数组(用typedef char S[8]表示),所以其元素的的大小为sizeof(S) = 8。因此a[1] = a+1*sizeof(S) = a+8,这时已经越界了,运行后果不可预料,呵呵

回复
winstonch 2005-01-19
对于指针加1编译器是根据指针指向的类型来加的,你不分配空间把它加1也是这个结果,总不能这是对的吧
#include<malloc.h>
#include<string.h>
int main()
{

typedef unsigned char T[8];
T* a;
a = 0;
printf("0x%x\n",a);
printf("0x%x\n",a+1);

return 0;
}
回复
CMyMfc 2005-01-19
to piaozi2003() (

你的a 是数组指针类型, 当然a + 1的指向下一个元素为8的数组
a + 1的值比a的值当然要大8了

但是a + 1指向的内存并不是你分配的, 你已经越界了
回复
CMyMfc 2005-01-19
winstonch是对的, 不用研究了
回复
piaozi2003 2005-01-19
To: CMyMfc(星际人生:=E.F=FlyForEver)
winstonch()

我说的是正确的!
在程序中插入代码:

printf("%x\n",a);
printf("%x\n",a+1);
printf("%x\n",a+2);

可以看到每个地址之间相差8,也就是所系统知道分配T的实际长度是8。

回复
peter9606 2005-01-19
老迈 你说说吧
回复
laomai 2005-01-19
呵呵,等我把值班室的饼子们喊来一起研究。
回复
winstonch 2005-01-19
CMyMfc(星际人生:=E.F=FlyForEver) 说说看
回复
CMyMfc 2005-01-19
看错了, 你的T的定义跟楼主不一样, 不好意思
回复
CMyMfc 2005-01-19
#include<malloc.h>
#include<string.h>
int main()
{

typedef unsigned char T[8];
T* a;
a = (T*)malloc(2*sizeof(T)) ;
memcpy(a[0],"1234567",8) ; // 虽然a有了内存, 但是a[0]还没有分配内存, 其实这也是错的
memcpy(a[1],"ABCDEFG",8) ;
printf("%s\n",a[0]);
printf("%s\n",a[1]);

return 0;
}
回复
CMyMfc 2005-01-19
其实winstonch也没全对
回复
winstonch 2005-01-19
CMyMfc(星际人生:=E.F=FlyForEver)
to piaozi2003() ( )

其实你是错的
------------------------------
这句话是对的,piaozi2003() ( )你得注意一下了,你的理解有问题,能输出正确的结果和a[0],a[1]的地址是说明不了这个问题的,占了别人的空间输出结果也可能是正确的,那么这个地址一定是"正确的",
但a[1]的地址已经不是他申请的了,是别人的地址,将来的结果很可能是他破坏别人的数据,或数据被别人破坏
回复
nicknide 2005-01-19
不过我越看越有问题……还是调试一下再说……
回复
CMyMfc 2005-01-19
T a ;
a = (T)malloc(2*sizeof(T)) ; // a 指向了一段内存, 这段内存存储了两个数组指针

a 是数组指针类型, 是用来指向数组的, 怎么能指向指针?

winstonch() 受苦了, 让你蒙受了不白之冤, 我来给你昭雪了
回复
CMyMfc 2005-01-19
to piaozi2003() ( )

其实你是错的
回复
piaozi2003 2005-01-19
在此代码中,T不光是一个指针,它还指向八字符的空间,编译器会记住这个规定,并在给T分配空间时
分配这连续的8字节空间,所以不能简单的从sizeof(T)上来判断T的分配空间长度。
回复
发动态
发帖子
C语言
创建于2007-09-28

6.3w+

社区成员

C语言相关问题讨论
申请成为版主
社区公告
暂无公告