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

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

概述int *ptr = malloc(sizeof(char));*ptr = 100000;printf("%d\n", *ptr); // 100000 不应该只为char分配足够的内存,即1个字节?因此最大数量不应该是255? 它如何打印100000? 更新 谢谢你的回答.如果它覆盖了下一个字节,那么C如何知道这个数字大于一个字节,而不只是查看第一个字节? 因为C没有内存范围检查.它分
int *ptr = malloc(sizeof(char));*ptr = 100000;printf("%d\n",*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).

总结

以上是内存溢出为你收集整理的为什么在一个字节中分配一个大数字在C中工作?全部内容,希望文章能够帮你解决为什么在一个字节中分配一个大数字在C中工作?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1223723.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-05
下一篇2022-06-05

发表评论

登录后才能评论

评论列表(0条)

    保存