int *x=(int*)malloc(1024);
потерять актерский состав; в этом нет необходимости, и он будет подавлять полезную диагностику, если вы забудете #include
stdlib.h или иным образом не получите приведение для malloc
в области видимости. Во-вторых, обычно лучше с точки зрения читабельности указывать количество элементов , которое вам нужно, определенного типа, а не количество байт . Вы бы сделали это так:
int *x = malloc(N * sizeof *x);
, который говорит "выделить достаточно памяти для хранения N int
значений".
*(x+2)=3192;
Хорошо. Вы присваиваете целочисленное значение 3192
x[2]
.
*(x+3)="sindhu";
Плохо Джуджу; Я удивлен, что компилятор не запустил эту строку. Вы пытаетесь сохранить значение типа char *
в int
(поскольку тип x
равен int *
, тип *(x + 3)
равен int
). Я не уверен, что вы пытаетесь достичь здесь; если вы пытаетесь сохранить значение указателя в x[3]
, обратите внимание, что значения указателя не обязательно могут быть представлены в виде int
(например, предположим, что char *
имеет ширину 4 байта, но int
является 2 байта в ширину). В любом случае типы не совместимы, и требуется приведение:
*(x + 3) = (int) "sindhu"; // equivalent to writing x[3] = (int) "sindhu"
Если вы пытаетесь скопировать содержимое строки в буфер, начинающийся с x[3]
, это определенно неправильный путь; чтобы сделать это «работой» (для достаточно свободных определений «работы»), вам необходимо использовать библиотечные функции strcpy
или memcpy
:
strcpy((char *) (x + 3), "sindhu"); // note the cast, and the fact that
// x + 3 is *not* dereferenced.
Что касается проблемы в операторе printf
, тип *(x + 3)
- это int
, а не char *
, что несовместимо со спецификатором преобразования %s
. Опять же, чтобы сделать эту «работу», вы должны сделать что-то вроде
printf("%d %s\n", *(x + 2), (char *) (x + 3));
Вы действительно не хотите хранить разные типы данных в одном и том же буфере памяти таким неструктурированным способом; если вы действительно не знаете, что делаете, это приводит к массивной изжоге.