糊涂了 这样对吗?

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;
}
...全文
204 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
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的分配空间长度。
加载更多回复(12)

69,371

社区成员

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

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