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

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

...全文
91 12 打赏 收藏 转发到动态 举报
写回复
用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"; 这种字符数组的整体赋值只能在字符数组初始化时使用,不能用于字符数组的赋值,字符数组的赋值只能对其元素一一赋值,赋值方法是错误的
欢迎各位热爱编程的朋友们,我们现在所在的这个课程是C++Unit1语法入门课程。在这个课程中,我们将一起探索C++语言的奥秘,一起开启我们的编程之旅。首先,我要告诉你的是,这个课程并不仅仅是一个普通的编程课程,它更像是一把打开你思维大门的钥匙。在这里,你将有机会开发和锻炼自己的逻辑思维能力,提升你的编程头脑。我们将一起学习C++程序的入门语法,通过实例教学,让你更好地理解和掌握这门语言。我们的目标不仅仅是让你学会编程,更重要的是,我们希望通过这个课程,让你能够将所学的知识应用到实际生活中,解决生活中的实际问题。无论是在学习、工作还是生活中,我们都会遇到各种各样的问题,而编程,就是解决问题的一种有效方式。通过学习C++,你将能够用编程的方式,解决一些实际问题,让自己的生活变得更加便捷。此外,编程不仅可以帮助我们解决问题,还可以让我们的生活变得更加丰富。通过编程,我们可以创造出各种各样的程序,这些程序可以帮助我们完成各种任务,提高我们的工作效率,也可以帮助我们实现一些以前无法实现的想法,让我们的生活变得更加多彩。总的来说,这个C++Unit1语法入门课程,将帮助你开启编程之路,提升你的逻辑思维能力,解决实际问题,让你的生活变得更加丰富。让我们一起,开始这段美妙的编程之旅吧!

69,377

社区成员

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

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