int *ptr = malloc(sizeof(char));
*ptr = 100000;
printf("%d\n", *ptr); // 100000
Run Code Online (Sandbox Code Playgroud)
不应该只为a分配足够的内存char,即1个字节?因此最大数量不应该是255?
它是如何打印的100000?
谢谢你的回答.如果它覆盖了下一个字节,那么C如何知道这个数字大于一个字节,而不只是查看第一个字节?
tcr*_*ley 11
因为C没有内存范围检查.它分配一个字节,然后通过指针的赋值覆盖它和接下来的三个字节.如果你在第一个malloc之后,但在赋值之前已经分配了另一部分内存,那么你可能已经覆盖了部分堆(取决于你的malloc如何工作).
这就是为什么指针在C中非常危险的原因.
格式语句中的%d(加上变量的类型)告诉编译器您正在查看int,并访问所有四个字节.
请注意,如果您确实已将值分配给char,例如char*ptr;*ptr = 100000;
然后使用一些编译器(并假设普通字符被视为已签名但默认值)它将打印出-96而不是255(或127).这是因为编译器不会自动将值限制为可以适合的最高值(有符号字符为127,无符号字符为255),而是仅溢出.大多数编译器会抱怨您正在尝试分配溢出变量的常量值.
它是-96的原因是100000%256是160,但作为有符号的char,它输出为 - (256-160).
简短回答:您通过写入不属于您的内存来调用未定义的行为,因此您永远不会知道您可能获得的内容.它可能只是工作,它可能会崩溃,或者它可能会做任何其他事情.在这种情况下,您将int位于ptr引用的位置,该位置将第一个字节写入int1字节分配的区域,并粉碎以下三个字节中的任何内容.
当您使用%d格式说明符printf读取sizeof(int)值时,从内存中读取字节以将其打印为int.如果只想输出一个字节的值,则需要执行以下操作:
printf("%d\n", *(char*)ptr);
Run Code Online (Sandbox Code Playgroud)
也就是说,告诉编译器ptr引用a char,然后获取该char值,该值被提升为int参数列表中的a并随后由说明%d符正确输出.
| 归档时间: |
|
| 查看次数: |
312 次 |
| 最近记录: |