abh*_*bhi 5 c malloc dynamic-memory-allocation
我正在使用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
Run Code Online (Sandbox Code Playgroud)
我使用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)时,我得到了不同的值(尽管每个都有自己定义的指针类型).
我的问题是:
虽然我已经使用malloc分配了2个字节(即16位)的堆mem,但是如何能够在这两个字节中保存65536(通过使用(p)这是一个整数类型的指针).我有一种感觉,这是因为void的自动类型转换为int*指针(在p = t中),所以将t分配给p会导致访问通过malloc分配的内存区域.??.
即使所有这一切都在发生,如何通过(*p)和(*d)对相同的记忆区域进行反映,打印出两个不同的答案(尽管如果我正在考虑问题1中的原因,这也可以解释).
有人可以对此有所了解,我会非常感激......如果有人可以解释这背后的原因..
非常感谢
先回答你的第二个问题:
解释是,anint
一般为 4 个字节,最高有效字节可能存储在前两个位置。Ashort
只有 2 个字节,它的数据也存储在前两个位置。显然,存储65536
在 anint
和 a中short
,但指向相同的内存位置,将导致数据存储相对于 偏移两个字节int
,short
其中 的两个最低有效字节int
对应于 的存储short
。
因此,当编译器打印 时*d
,它将其解释为 ashort
并查看与 a 的存储相对应的区域short
,该区域不是编译器之前存储写入65536
时的位置*p
。请注意,写入*p = 65536;
会覆盖前面的内容*d = 65536;
,用 填充两个最低有效字节0
。
关于第一个问题:编译器不会存储2个字节以内的65536
for *p
。它只是超出了您分配的内存范围 - 这可能会在某些时候导致错误。