C — Присвоить значение указателю в позиции, возможно ли это?

#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:

  1. calloc(10,1) выделяет 10 однобайтовые элементы, а не 10 целые числа. Итак (за исключением 8 бит UCS, где int равен 2 байтам), ваша выделенная область памяти слишком коротка. если вы хотите выделить место для 10 целых чисел, вам необходимо int *p = calloc(10, sizeof(*p));
  2. 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]