简单的赋值操作,有点不明白,在线等。

yiruirui0507 2010-07-22 10:20:02
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
struct helloworld_t
{
int num;
char helloworld[0];
};

int main()
{
struct helloworld_t *p;
unsigned int size = sizeof(struct helloworld_t) + strlen("Hello World!\n") + 1;
p = (struct helloworld_t *) malloc(size);
assert(p!=NULL);

memcpy(p, "\x03\x00\x00\x00Hello World!\n", size);

while (p->num--)
{
printf(p->helloworld);
}

//printf("%d \n", sizeof(helloworld_t));

free((void *)p);
return 0;
}

输出3个Hello World!
如果把 memcpy(p, "\x03\x00\x00\x00Hello World!\n", size);改成
memcpy(p, "\x02\x00\x00\x00Hello World!\n", size);
则输出两个Hello World!
换成1,则输出一个Hello World!
不太明白 memcpy(p, "\x03\x00\x00\x00Hello World!\n", size); 这句话的意思,是给num赋值操作码?拼什么也能这样赋值?不懂,等待高手的回答!
...全文
276 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
yiruirui0507 2010-07-23
  • 打赏
  • 举报
回复
等我给帖子加了分再结贴吧,让大家都能收获点分数!
yiruirui0507 2010-07-23
  • 打赏
  • 举报
回复
不知道咋么搞的,突然出现连接错误,删除DEBUG目录也删不掉,看来要重启了。总之感谢各位的帮忙。谢谢思密达!
zhulang4788 2010-07-23
  • 打赏
  • 举报
回复
 蛋定,,,,,自已去计算机上弄一下不就清楚了
赵4老师 2010-07-23
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
canican 2010-07-23
  • 打赏
  • 举报
回复
mark
lgzh2010 2010-07-23
  • 打赏
  • 举报
回复
定着.
duke56 2010-07-22
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 yiruirui0507 的回复:]
感谢大家的回答!在这里最后我说一下我做的事情吧,哈哈。有那么点倔强了,各位包涵。

由于八进制每位代表3个字节,这里的INT 是32位的,八进制没法表示,所以我斗胆取了俩个数的最小公倍数96,也就是我在额外多申请8个字节,64位,然后加上NUM的32位也就是96位了。

代码如下:
unsigned int size = sizeof(struct helloworld_t) + str……
[/Quote]
int只有32位,你这样多出64位,也就是溢出了...就会往后边再入,就是占用char后边的地址空间

要不你在结构体中也再定义几个int型,使它达到96位
yiruirui0507 2010-07-22
  • 打赏
  • 举报
回复
感谢大家的回答!在这里最后我说一下我做的事情吧,哈哈。有那么点倔强了,各位包涵。

由于八进制每位代表3个字节,这里的INT 是32位的,八进制没法表示,所以我斗胆取了俩个数的最小公倍数96,也就是我在额外多申请8个字节,64位,然后加上NUM的32位也就是96位了。

代码如下:
unsigned int size = sizeof(struct helloworld_t) + strlen("Hello World!\n") + 1+8;

memcpy(p, "\o0\o0\o0\o0\o0\o0\o0\o0\o0\o0\o0\o0\o0\o0\o0\o0\o0\o0\o0\o0\o0\o0\o0\o0\o0\o0\o0\o0\o0\o0\o0\o0Hello World!\n", size);
这里用八进制同样表示了96位,32个八进制位,汗。
可以正确编译,但是输出的结果令我又吃了一惊,死循环,界面流动很快,说真的,界面还是非常漂亮的。嘿嘿
但是我更想知道我哪里又犯错了!
zhangweiit 2010-07-22
  • 打赏
  • 举报
回复
我上面都说了,注意,是4个字节到num里面
3Hello...
H,e,l,都进去了,那就是一个未知数了
zhangweiit 2010-07-22
  • 打赏
  • 举报
回复
"3\x0\x0\x0Hello World!\n"

你用这个看一下,是不是51
yiruirui0507 2010-07-22
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 arong1234 的回复:]
你应该尽量避免这样赋值

引用 24 楼 yiruirui0507 的回复:
引用 22 楼 arong1234 的回复:
num需要4个字节,3Hello中的3只有一个字节,3Hel会被一起赋值进去,num就等于
'l'<<24 + 'e' << 16 + 'H' <<8 + '3'
这是一个非常非常大的数,看起来就似乎是死循环


引用 19 楼 yiruirui0507 的……
[/Quote]
我按照这里的理解用八进制表示32位,
没办法了,八进制每位代表3个BIT,32除以3除不尽,所以我没成功。你能用八进制或者其他进制在这里表示吗?3KS。
arong1234 2010-07-22
  • 打赏
  • 举报
回复
你应该尽量避免这样赋值[Quote=引用 24 楼 yiruirui0507 的回复:]
引用 22 楼 arong1234 的回复:
num需要4个字节,3Hello中的3只有一个字节,3Hel会被一起赋值进去,num就等于
'l'<<24 + 'e' << 16 + 'H' <<8 + '3'
这是一个非常非常大的数,看起来就似乎是死循环


引用 19 楼 yiruirui0507 的回复:
引用 17 楼 arong1234 的回复:
num是struct的前4……
[/Quote]
yiruirui0507 2010-07-22
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 arong1234 的回复:]
num需要4个字节,3Hello中的3只有一个字节,3Hel会被一起赋值进去,num就等于
'l'<<24 + 'e' << 16 + 'H' <<8 + '3'
这是一个非常非常大的数,看起来就似乎是死循环


引用 19 楼 yiruirui0507 的回复:
引用 17 楼 arong1234 的回复:
num是struct的前4个字节,memcpy的前4个字节正好被拷贝倒n……
[/Quote]
哦明白了,3这里被作为一个字节,真的没想到。汗一下,难道必须必须借助十六进制才能表示位数吗?如果用十进制,哦对十进制不行,八进制可以,我试一下。谢谢!
yiruirui0507 2010-07-22
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 zhangweiit 的回复:]
这里,可能有一点很容易弄错
'0'不是0,而是48
'3'不是3,而是51

只有'\x03'才是3
[/Quote]

但是memcpy(p, "3Hello World!\n", size);得话
我调试,从WATCH窗口中看到NUM的值不是51,而是一个非常大的数。咋么解释,谢谢是必须说的。
arong1234 2010-07-22
  • 打赏
  • 举报
回复
num需要4个字节,3Hello中的3只有一个字节,3Hel会被一起赋值进去,num就等于
'l'<<24 + 'e' << 16 + 'H' <<8 + '3'
这是一个非常非常大的数,看起来就似乎是死循环
[Quote=引用 19 楼 yiruirui0507 的回复:]
引用 17 楼 arong1234 的回复:
num是struct的前4个字节,memcpy的前4个字节正好被拷贝倒num的位置,当然就间接对num赋值了

引用 16 楼 yiruirui0507 的回复:
引用 14 楼 zhangweiit 的回复:
不过,楼主这个代码,是很奇怪的代码,
应该只是练习吧,实际工作中,一般不会碰到这样的代码,
如果人这样写,那基本上会被我fire……
[/Quote]
zhangweiit 2010-07-22
  • 打赏
  • 举报
回复
这里,可能有一点很容易弄错
'0'不是0,而是48
'3'不是3,而是51

只有'\x03'才是3
zhangweiit 2010-07-22
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 yiruirui0507 的回复:]

引用 14 楼 zhangweiit 的回复:


感谢你的回答,对于赋值这个我理解起来有点吃力,没体现把3赋值给NUM啊?感觉很奇怪,哪里说把3赋值给NUM了?为什么你们都知道这里是赋值操作呢?
[/Quote]

\x03就是3

出现\x的时候,就是直接16进制赋值
\x03是3,\x0f是15

yiruirui0507 2010-07-22
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 arong1234 的回复:]
num是struct的前4个字节,memcpy的前4个字节正好被拷贝倒num的位置,当然就间接对num赋值了

引用 16 楼 yiruirui0507 的回复:
引用 14 楼 zhangweiit 的回复:
不过,楼主这个代码,是很奇怪的代码,
应该只是练习吧,实际工作中,一般不会碰到这样的代码,
如果人这样写,那基本上会被我fire


感谢你的回答,对于赋值这个我理解起来……
[/Quote]
谢谢阿荣!我还有疑惑:
memcpy(p, "3Hello World!\n", size);
我直接把3写进去为什么就不可以,还出现死循环呢?不是一样的正好被拷贝倒num的位置,当然就间接对num赋值吗?请指点.
liutengfeigo 2010-07-22
  • 打赏
  • 举报
回复
真的,可读性,维护性最重要。
arong1234 2010-07-22
  • 打赏
  • 举报
回复
num是struct的前4个字节,memcpy的前4个字节正好被拷贝倒num的位置,当然就间接对num赋值了[Quote=引用 16 楼 yiruirui0507 的回复:]
引用 14 楼 zhangweiit 的回复:
不过,楼主这个代码,是很奇怪的代码,
应该只是练习吧,实际工作中,一般不会碰到这样的代码,
如果人这样写,那基本上会被我fire


感谢你的回答,对于赋值这个我理解起来有点吃力,没体现把3赋值给NUM啊?感觉很奇怪,哪里说把3赋值给NUM了?为什么你们都知道这里是赋值操作呢?
[/Quote]
加载更多回复(16)

69,371

社区成员

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

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