热爱学习的我又来请教问题了。

dahjgcqvwvr 闽南师范大学 电子信息科学与技术  2019-05-29 03:40:24
想请问高手为什么这种字符串赋值是一堆乱码

...全文
46 点赞 收藏 12
写回复
12 条回复
dahjgcqvwvr 2020年12月14日
转发点击抽奖
回复 点赞
gouyanfen 2019年05月29日
其实你想要测试这个问题的结果,你可以选择把p->age先初始化为特定的字符,重新定义一个 char * c_age=p->age[SIZE],然后strcpy之后打印出内存中的数字对比一下你就明白了 struct student { int num; char age[SIZE]; char comp_age[20]; } struct student *p=new student; char * c_age=p->age[SIZE], strcpy(c_age,"hello world"); for (i=0;i<(SIZE+20);i+=4) printf("%08X\n",*(DWORD*)((DWORD)p-age+i)); 这样输出内存中的数字出来看下就明白了
回复 点赞
dahjgcqvwvr 2019年05月29日
引用 6 楼 gouyanfen 的回复:
p->age[SIZE]这个是指向age这个这符数组的头地址+(sizeof(char)*SIZE),假定可以使用=赋值,那么越界的同时会把hello放到p->age结尾之后的地方:
假如:p-age分配的地址为0x10000;那么p->age[SIZE]其实指向的地方是0x10050
谢谢 明白了
回复 点赞
gouyanfen 2019年05月29日
内存是个连续空间,age[SIZE]是什么取决于你的程序内存中的结构,溢出攻击就是采用这种方法,重新构造代码
回复 点赞
dahjgcqvwvr 2019年05月29日
引用 7 楼 weixin_45066336 的回复:
age这个数组你只能取到SIZE-1,那么第SIZE个是什么?
哈哈 忽略了 不过不影响重点。
回复 点赞
ENDLESS.c 2019年05月29日
age这个数组你只能取到SIZE-1,那么第SIZE个是什么?
回复 点赞
gouyanfen 2019年05月29日
p->age[SIZE]这个是指向age这个这符数组的头地址+(sizeof(char)*SIZE),假定可以使用=赋值,那么越界的同时会把hello放到p->age结尾之后的地方: 假如:p-age分配的地址为0x10000;那么p->age[SIZE]其实指向的地方是0x10050
回复 点赞
赵4老师 2019年05月29日
strcpy(p->age,"hello");
回复 点赞
dahjgcqvwvr 2019年05月29日
引用 3 楼 自信男孩 的回复:
[quote=引用 2 楼 小提琴家爱因斯坦 的回复:]
[quote=引用 1 楼 liups 的回复:]p->age[SIZE]="hello";

这种字符数组的整体赋值只能在字符数组初始化时使用,不能用于字符数组的赋值,字符数组的赋值只能对其元素一一赋值,赋值方法是错误的
我知道是错的。但我不明白为什么是一堆乱码[/quote]
因为你把一个地址赋值给age[SIZE];而不是把字符串赋值给age中的元素。

另外,SIZE是age的长度,那么这样赋值也已经导致age越界了。

[/quote]不好意思 有点不明白。“hello”赋值相当于一个地址吗。size是80也不够吗
回复 点赞
自信男孩 2019年05月29日
引用 2 楼 小提琴家爱因斯坦 的回复:
[quote=引用 1 楼 liups 的回复:]p->age[SIZE]="hello";

这种字符数组的整体赋值只能在字符数组初始化时使用,不能用于字符数组的赋值,字符数组的赋值只能对其元素一一赋值,赋值方法是错误的
我知道是错的。但我不明白为什么是一堆乱码[/quote]
因为你把一个地址赋值给age[SIZE];而不是把字符串赋值给age中的元素。

另外,SIZE是age的长度,那么这样赋值也已经导致age越界了。

回复 点赞
dahjgcqvwvr 2019年05月29日
引用 1 楼 liups 的回复:
p->age[SIZE]="hello"; 这种字符数组的整体赋值只能在字符数组初始化时使用,不能用于字符数组的赋值,字符数组的赋值只能对其元素一一赋值,赋值方法是错误的
我知道是错的。但我不明白为什么是一堆乱码
回复 点赞
liups 2019年05月29日
p->age[SIZE]="hello"; 这种字符数组的整体赋值只能在字符数组初始化时使用,不能用于字符数组的赋值,字符数组的赋值只能对其元素一一赋值,赋值方法是错误的
回复 点赞
发动态
发帖子
C语言
创建于2007-09-28

3.2w+

社区成员

24.0w+

社区内容

C语言相关问题讨论
社区公告
暂无公告