我正在使用malloc编写某些代码,然后遇到了一个问题,所以我编写了一个测试代码,它实际上总结了整个混乱,如下:
我正在使用malloc分配2个字节的内存。malloc返回一个void*指针,存储在一个void*指针“t”中。
然后声明了2个指针p-整数类型和d-短类型。然后我将t分配给它们两个(p = t和d = t),这意味着d和p都指向堆上相同的内存位置。
当我尝试将65536(2 ^ 16)保存到(* d)时,我得到了警告,指出大整数值被截断,这是预期的。现在我再次将65536(2 ^ 16)保存到(* p)中,这没有引起任何警告。
打印(* p)和(* d)时,我得到了不同的值(虽然每个正确地定义了自己的指针类型)。
我的问题是:
1. 尽管我使用malloc分配了2个字节(即16位)的堆内存,但我如何能够在这两个字节中保存65536(通过使用整数类型的指针p)?我有一种感觉,那就是void到int *指针的自动类型转换(在p = t中),所以是将t分配给p导致访问超出通过malloc分配的内存区域吗?
2. 即使发生所有这些情况,为什么通过(* p)和(* d)解除引用相同的内存区域会打印出两个不同的答案(虽然如果我在问题1中所想的原因可以解释这一点)。
能否有人对此进行解释,将不胜感激。同时,如果有人能够解释其原因,那就更好了。
# 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个字节的内存。malloc返回一个void*指针,存储在一个void*指针“t”中。
然后声明了2个指针p-整数类型和d-短类型。然后我将t分配给它们两个(p = t和d = t),这意味着d和p都指向堆上相同的内存位置。
当我尝试将65536(2 ^ 16)保存到(* d)时,我得到了警告,指出大整数值被截断,这是预期的。现在我再次将65536(2 ^ 16)保存到(* p)中,这没有引起任何警告。
打印(* p)和(* d)时,我得到了不同的值(虽然每个正确地定义了自己的指针类型)。
我的问题是:
1. 尽管我使用malloc分配了2个字节(即16位)的堆内存,但我如何能够在这两个字节中保存65536(通过使用整数类型的指针p)?我有一种感觉,那就是void到int *指针的自动类型转换(在p = t中),所以是将t分配给p导致访问超出通过malloc分配的内存区域吗?
2. 即使发生所有这些情况,为什么通过(* p)和(* d)解除引用相同的内存区域会打印出两个不同的答案(虽然如果我在问题1中所想的原因可以解释这一点)。
能否有人对此进行解释,将不胜感激。同时,如果有人能够解释其原因,那就更好了。