#c #pointers #integer #printf #dynamic-memory-allocation
#c #указатели #целое число #printf #динамическое выделение памяти
Вопрос:
В Visual Studio 2019 я попытался присвоить значение указателю int в указанной позиции, но это не сработало. Возможно ли это?
Более того, как я могу напечатать значение указателя, а не адрес?
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *p =(int*)calloc(10,1);
p[0]=1;
p[1]=0;
p[2]=1;
printf("%dn",p);
}
Спасибо
Комментарии:
1. Если
sizeof(int)
в вашей системе не равно 2 (маловероятно), эта программа имеет неопределенное поведение. Вы выделили только 10 байт для массива, в который вы пытаетесь сохранить 3 целых числа. Что касается печати, использование%d
для отображения типа указателя неверно, поскольку указатель может быть больше, чем int . Правильный спецификатор%p
. Если вместо этого вы пытаетесь напечатать одно из этих целых чисел, то вы должны разыменовать указатель, чтобы выбрать одно:printf("%dn", p[i]);
гдеi
0, 1 или 2. Но прочитайте мой первый пункт о памяти, потому что сейчас у вас неопределенное поведение.2. Я настоятельно рекомендую вам пересмотреть указатели из любого ресурса, который вы пытаетесь изучить C. По моему личному мнению, предпочтительнее подход, который объясняет память в терминах самой памяти, а не в терминах абстракций C.
Ответ №1:
calloc(10,1)
выделяет10
однобайтовые элементы, а не10
целые числа. Итак (за исключением 8 бит UCS, где int равен 2 байтам), ваша выделенная область памяти слишком коротка. если вы хотите выделить место для 10 целых чисел, вам необходимоint *p = calloc(10, sizeof(*p));
printf("%d", p)
вызывает UB какp
ссылку (адрес), хранящуюся в указателеp
. Вам нужно разыменовать указатель, чтобы получить целое число, на которое ссылается (указывает)p
указательprintf("%dn, *p);
Чтобы распечатать ссылку, хранящуюся в указателе, вам необходимо использовать правильный формат: printf("%pn", (void *)p);
.
Ответ №2:
Это работает.
Чтобы напечатать значение, вам нужно изменить ссылку с помощью * или индекса с помощью [] .
printf("%dn",*p); //p[0]
printf("%dn", p[0]); //p[0]
printf("%dn",*(p 1)); //p[1]
printf("%dn", p[1]); //p[1]