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

dahjgcqvwvr 2019-05-29 03:40:24
想请问高手为什么这种字符串赋值是一堆乱码

...全文
100 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
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"; 这种字符数组的整体赋值只能在字符数组初始化时使用,不能用于字符数组的赋值,字符数组的赋值只能对其元素一一赋值,赋值方法是错误的

70,020

社区成员

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

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