社区
C语言
帖子详情
糊涂了 这样对吗?
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
打赏
收藏
糊涂了 这样对吗?
#include #include 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; }
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
TCP
糊涂
窗口综合症
1、什么是TCP
糊涂
窗口综合症? TCP 报文首部就占 20 字节了,如果每次接收方只允许发送方发送两三个字节,那就为了传输这么几个有效的字节,还得附加上 20 字节的数据,这就是很浪费资源性能的。 这就是所谓的“TCP...
糊涂
窗口综合征 SWS
导致出现接收端的通告窗口过小 再导致发送端窗口过小 从而导致产生大量的小数据包 这样的小数据包中头部占比大 导致传输效率低下 这样的行为就叫做
糊涂
窗口综合征 在网上看到一个例子可以很好的说明这个过程 假设...
新手自学Spring Boot遇到org.springframework.boot包不存在,
糊涂
解决了!!!有大神可以解释一下吗?
新手自学Spring Boot遇到org.springframework.boot包不存在,
糊涂
解决了!!!有大神可以解释一下吗? 第一天学习Spring Boot没想到就遇到问题了,在网上查找资料后还是没有解决! Idea版本:2020.1 maven版本:...
37-tcp协议——
糊涂
窗口综合征和nagle算法
1.
糊涂
窗口综合征 假设一种这么情况,当发送方的应用进程发送数据的速度比较慢,或者接收方的应用进程读取数据速度比较慢,又或者双方都有。但无论是对哪一种情况,都会让发送数据很小,这将会降低tcp的性能。...
27.TCP协议-
糊涂
窗口综合症
糊涂
窗口综合症
C语言
69,371
社区成员
243,081
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章