【发布时间】:2012-05-02 23:35:15
【问题描述】:
我正在使用 malloc 编写代码,然后遇到了一个问题,所以我编写了一个测试代码,它实际上总结了下面的整个混乱::
# include <stdio.h>
# include <stdlib.h>
# include <error.h>
int main()
{
int *p = NULL;
void *t = NULL;
unsigned short *d = NULL;
t = malloc(2);
if(t == NULL) perror("\n ERROR:");
printf("\nSHORT:%d\n",sizeof(short));
d =t;
(*d) = 65536;
p = t;
*p = 65536;
printf("\nP:%p: D:%p:\n",p,d);
printf("\nVAL_P:%d ## VAL_D:%d\n",(*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 都指向堆上的相同内存位置。 p>
在尝试将 65536(2^16) 保存到 (*d) 时,我收到警告说大 int 值被截断,这是预期的。 现在我再次将 65536(2^16) 保存到 (*p) 没有引起任何警告。
*在打印 (*p) 和 (d) 时,我得到了不同的值(尽管每个值都对自己定义的指针类型正确)。
我的问题是:
虽然我已经使用 malloc 分配了 2 个字节(即 16 位)的堆内存,但我如何能够在这两个字节中保存 65536(通过使用整数类型的指针 (p)) .?? 我有一种感觉,这是因为 void 到 int* 指针(在 p = t 中)的自动类型转换,所以将 t 分配给 p 会导致访问通过 malloc 分配的内存区域之外的内存区域吗? . ??.
1234563 1).
有人能对此有所了解吗,将不胜感激..如果有人能解释这背后的原因..
非常感谢
【问题讨论】:
-
Malloc 可能会将请求的大小向上舍入到某个乘数。不知道 *nix,但 Windows 喜欢将其四舍五入为 8 字节的倍数。如果是这样的话,你在你请求的区域之外写,但它恰好在安全范围内,因此你没有破坏其他任何东西。
-
你已经小心地滥用了铸造权力来获得未定义的行为。 C 为您提供了强大的能力和灵活性来做坏事。你必须承担起不这样做的责任。
-
@dmckee 我知道我在做什么不应该做但是在偶然发现之后我很想知道它背后的确切原因,我最初猜测是自动类型转换为 int * 的事实分配 2 字节的 void* 指针导致 int* 指针访问更多内存然后 2 字节,因为在我的机器上 int 是 4 字节。这是正确的(我的假设)
-
好的,然后真正的乐趣开始了。阅读大字节序和小字节序。然后阅读混合端并准备好畏缩。
标签: c malloc dynamic-memory-allocation