社区
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;
}
...全文
231
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
糊涂
窗口综合症
TCP
糊涂
窗口综合症是由于接收方窗口过小导致发送方发送小数据报文,造成资源浪费。解决方法包括接收方在窗口小于内核缓冲区一半时关闭窗口,等待窗口增大后再开放,以及采用延迟确认应答策略,避免频繁小窗确认。发送方则通过Nagle算法避免发送小数据包,提高传输效率。
什么是
糊涂
窗口综合征和解决方法
本文解释了
糊涂
窗口综合征的概念,其产生原因在于发送端或接收端处理小数据包的方式不当,导致网络传输效率降低。文章详细分析了发送端与接收端的具体原因,并提出了有效的解决方案。
难得
糊涂
“
糊涂
”
本文探讨了孔子、老子等哲人如何看待
糊涂
,并揭示了难得
糊涂
的真正含义——既是一种处事智慧,也是生活态度。作者强调了在复杂世事中保持简单、随遇而安的重要性,指出假
糊涂
与真
糊涂
的区别,以及在人生中的适当运用。
糊涂
窗口综合征 SWS
本文深入解析
糊涂
窗口综合征(SWS),探讨其在网络传输中导致效率低下的原因,包括发送与接收端处理包不一致,产生大量小数据包的问题。并详细介绍了避免SWS的策略,如Nagle算法、延迟确认机制及窗口探测等,以及零窗口情况下如何解决死锁问题。
糊涂
窗口综合症
本文深入探讨了
糊涂
窗口综合症的成因,包括发送端和接收端应用进程产生或处理数据缓慢导致的问题,以及极端情况下有效载荷过小的情况。介绍了Nagle算法和Clark解决方法等解决方案,旨在减少网络流量并提高数据传输效率。
C语言
70,039
社区成员
243,246
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章