Пишех код, използвайки 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
Разпределям 2 байта памет с помощта на malloc. 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) получих различни стойности (въпреки че всяка е правилна за собствен дефиниран тип указател).
Въпросът ми е:
Въпреки че съм разпределил 2 байта (т.е. 16 бита) от heap mem, използвайки malloc, как мога да запазя 65536 в тези два байта (като използвам (p), който е указател от тип цяло число).?? имам чувството, че причината за това е автоматичното преобразуване на типа на void в int* указател (в p =t), така че присвояването на t на p води до достъп до региони на паметта извън това, което е разпределено чрез malloc . ??.
Въпреки че всичко това се случва, как, по дяволите, премахването на един и същ регион на паметта чрез (*p) и (*d) отпечатва два различни отговора (въпреки че това също може да се обясни, ако това, което си мисля, е причината за въпрос 1).
Може ли някой да хвърли малко светлина върху това, ще бъде наистина оценено..а също и ако някой може да обясни причините зад това..
Много благодаря