这个问题怎么解释?

万俟淋曦
人工智能领域优质创作者
博客专家认证
2018-11-26 10:14:16

将“hello world!”拷贝给str,输出str是“hello world!”,但str的大小仍是5字节,正常存放“hello world!”不是12字节吗?
“hello world!”在str中是怎么存放的?
...全文
75 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
轻箬笠 2018-11-27
  • 打赏
  • 举报
回复
数组越界,没崩是给面子了。
sizeof是C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数。
MSDN上的解释为:
The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type(including aggregate types). This keyword returns a value of type size_t.
其返回值类型为size_t,在头文件stddef.h中定义。这是一个依赖于编译系统的值,一般定义为
typedef unsigned int size_t;
AlbertS 2018-11-27
  • 打赏
  • 举报
回复
sizeof取的是字符数组定义时的大小,与里面的数据无关
将12个字节大小的字符串赋值给5个字节大小的字符数组,行为未定义,这次没有奔溃可能下次就挂了
就比如一个卡车,可以装5米高的货,但是你装了7米,看着也没事,车没问题,货也没问题,但是通过5米高的桥时,货直接就被撞飞了
或者你就停在5米高的桥底下,你非要装7米,桥肯定被你弄坏了
lin5161678 2018-11-27
  • 打赏
  • 举报
回复
引用 2 楼 niiiloc 的回复:
数组的长度存放在数组头中
因此sizeof(str)没变
但是你越界copy的内容是存在的,printf %s打印所有\0之前的字符,所以能打印出hello world
数组长度没存在数组头中
sizeof(str) 根据str的类型得到结果 不需要存
假如你说的 数组头里面有数组的长度
那么 为什么sizeof(str+0) 结果和 sizeof(str) 不一样
不都是数组头么
zhouqunhai 2018-11-27
  • 打赏
  • 举报
回复
str的长度是5,但5之后的数据任然是p后的数据,虽然数据越界了,但仍能读取
636f6c696e 2018-11-27
  • 打赏
  • 举报
回复
数组的长度存放在数组头中 因此sizeof(str)没变 但是你越界copy的内容是存在的,printf %s打印所有\0之前的字符,所以能打印出hello world
万俟淋曦 2018-11-27
  • 打赏
  • 举报
回复
引用 3 楼 zhouqunhai 的回复:
str的长度是5,但5之后的数据任然是p后的数据,虽然数据越界了,但仍能读取
言简意赅,明白了,谢谢
万俟淋曦 2018-11-27
  • 打赏
  • 举报
回复
引用 2 楼 niiiloc 的回复:
数组的长度存放在数组头中 因此sizeof(str)没变 但是你越界copy的内容是存在的,printf %s打印所有\0之前的字符,所以能打印出hello world
明白了,谢谢
lin5161678 2018-11-27
  • 打赏
  • 举报
回复
数组越界 修改了数组之外的内存数据
至于修改了什么就无法预测了
这是未定义行为
只观察结果没有意义

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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