Я писал код, используя таНос для чего-то, а затем столкнулся с вопросом, поэтому я написал тестовый код, который фактически суммирует всю путаницу, которая находится ниже ::Динамического распределения памяти в «с» Проблемы
# 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:: [email protected]:~/Desktop/ad/A1/CC$ ./test
SHORT:2
P:0x9512008: D:0x9512008:
VAL_P:65536 ## VAL_D:0
Я выделяю 2 байта памяти с помощью malloc. Malloc, который возвращает указатель void * хранится в указателе void * t '.
Затем после этого указывается 2 указателя p - целочисленный тип и d - короткого типа. то я назначил t каждому из них * (p = t и d = t) * , что означает, что оба d & p указывают на то же место mem в куче.
при попытке сэкономить 65536 (2^16) до (* d) я получаю предупреждение о том, что большое значение int усечено, что и ожидалось. Теперь я снова сохранил 65536 (2^16) до (* p), который не вызвал никаких предупреждений.
* При печати обоих (* p) и () у меня разные значения (хотя каждый из них имеет собственный определенный тип указателя).
Мой вопрос являются:
Хотя я выделил 2 байта (т.е. 16 бит) кучи мем с помощью таНос Как я смог сохранить 65536 в этих двух байтах (при использовании (р) который является указателем целочисленного типа). У меня такое ощущение, что причиной этого является автоматическое преобразование типа void в int * pointer (в p = t), так что присвоение t p приводит к доступу к областям памяти за пределами того, что выделяется через malloc. ??.
Несмотря на то, что все это происходит из-за того, как ад, разыгрывающий одну и ту же область памяти через (* p) и (* d), печатает два разных ответа (хотя это также можно объяснить, если я думаю о причине, о которой идет речь 1).
Может кто-нибудь положил некоторый свет на это, он будет действительно appreciated..and также, если кто-нибудь может объяснить причины этого ..
Большое спасибо
Malloc может округлять запрошенный размер до определенного множителя. Не знаю о * nix, но Windows любит округлять его до кратных 8 байтам. Если это так, вы пишете вне области, которую вы просили, но она находится в пределах запаса прочности, и поэтому вы не развращаете что-либо еще. – DCoder
Вы тщательно злоупотребляли силой каста для получения неопределенного поведения. C дает вам большую силу и гибкость, чтобы делать * плохие вещи *. Вы должны взять на себя ответственность за ***, не делайте их ***. – dmckee
@dmckee Я знаю, что я делаю, не следует делать, но после спотыкания на этом мне было любопытно узнать точные причины, по которым я изначально догадался, был тот факт, что автоматическое преобразование типа в int * выделенного 2-байтового указателя void * приводит к тому, что int * указатель получает больше памяти, а затем 2 байта, потому что на моей машине int имеет 4 байта. Правильно ли это (мое предположение) – abhi