我正在使用malloc编写代码然后面临一个问题所以我写了一个测试代码,它实际上总结了下面的整个混乱::
# include # include # include int main() { int *p = NULL; void *t = NULL; unsigned short *d = NULL; t = malloc(2); if(t == NULL) perror("n ERROR:"); printf("nSHORT:%dn",sizeof(short)); d =t; (*d) = 65536; p = t; *p = 65536; printf("nP:%p: D:%p:n",p,d); printf("nVAL_P:%d ## VAL_D:%dn",(*p),(*d)); return 0; } Output:: abhi@ubuntu:~/Desktop/ad/A1/CC$ ./test SHORT:2 P:0x9512008: D:0x9512008: VAL_P:65536 ## VAL_D:0
我使用malloc分配2个字节的内存。 返回void *指针的 Malloc 存储在void *指针’t’中 。
然后在那之后指出2个指针p – 整数类型和d – 短类型 。 然后我将t分配给它们* (p = t和d = t) * 这意味着d&p都指向堆上的相同mem位置。
试图保存65536(2 ^ 16)到(* d)我得到警告,大的int值被截断,这是预期的。 现在我再次将65536(2 ^ 16)保存到(* p),这没有引起任何警告。
*在打印(* p)和( d)时,我得到了不同的值(尽管每个都有自己定义的指针类型)。
我的问题是:
有人可以对此有所了解,我们将非常感激……如果有人能够解释这背后的原因..
非常感谢
首先回答你的第二个问题:
解释是int
通常是4个字节,最重要的字节可以存储在前两个位置。 short
(仅为2个字节)也将其数据存储在前两个位置。 显然,然后将65536
存储在int
和short
,但指向相同的内存位置,将导致数据存储偏移两个字节, int
相对于short
,与int
的两个最低有效字节对应于short
存储。
因此,当编译器打印*d
,它将其解释为short
并查看与存储相对应的区域的short
,这不是编译器在写入*p
时先前存储65536
。 注意写*p = 65536;
覆盖了之前的*d = 65536;
,用0
填充两个最低有效字节。
关于第一个问题:编译器不会将*p
的65536
存储在2个字节内。 它只是超出了你分配的内存范围 – 这可能会在某些时候导致错误。
在C中,没有任何保护来写出超出分配的界限。 只是不要这样做,任何事情都可能发生。 这里似乎对你有用,因为有些巧合,你分配的两个字节后面的空间不用于其他东西。
1)OS内存管理器的粒度为4K。 一位写入不太可能触发AV /段错误,但它会破坏相邻位置的任何数据,导致:
2)未定义的行为。 这组行为包括“非常正确的操作”,(现在!)。
以上就是c/c++开发分享‘c’问题中的动态内存分配相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/545062.html