加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

为什么在一个字节中分配一个大数字在C中工作?

发布时间:2020-12-16 10:54:38 所属栏目:百科 来源:网络整理
导读:int *ptr = malloc(sizeof(char));*ptr = 100000;printf("%dn",*ptr); // 100000 不应该只为char分配足够的内存,即1个字节?因此最大数量不应该是255? 它如何打印100000? 更新 谢谢你的回答.如果它覆盖了下一个字节,那么C如何知道这个数字大于一个字节,而
int *ptr = malloc(sizeof(char));

*ptr = 100000;

printf("%dn",*ptr); // 100000

不应该只为char分配足够的内存,即1个字节?因此最大数量不应该是255?

它如何打印100000?

更新

谢谢你的回答.如果它覆盖了下一个字节,那么C如何知道这个数字大于一个字节,而不只是查看第一个字节?

解决方法

因为C没有内存范围检查.它分配一个字节,然后通过指针的赋值覆盖它和接下来的三个字节.如果你在第一个malloc之后,但在赋值之前已经分配了另一部分内存,那么你可能已经覆盖了部分堆(取决于你的malloc如何工作).

这就是为什么指针在C中非常危险的原因.

格式语句中的%d(加上变量的类型)告诉编译器您正在查看int,并访问所有四个字节.

请注意,如果您确实已将值分配给char,例如char * ptr; * ptr = 100000;

然后使用一些编译器(并假设普通字符被视为已签名但默认值)它将打印出-96而不是255(或127).这是因为编译器不会自动将值限制为可以适合的最高值(有符号字符为127,无符号字符为255),而是仅溢出.大多数编译器会抱怨您正在尝试分配溢出变量的常量值.

它是-96的原因是100000%256是160,但作为有符号的char,它输出为 – (256-160).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读