Адреса в памяти

возник вопрос. С помощью аллокатора я создаю динамическую память под массив "buf", далее все элементы массива я переношу в указатель "def", который в свою очередь указывает на область памяти который я и выделил.

Интересует, адрес памяти которую я выделил - это и есть адрес указателя ?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) {
    
    int *def;
    int buf[] = {3,4,7,3,2,3,4};

    def = (int *)malloc(sizeof(buf));

    memcpy(def, buf, sizeof(buf));
    
    for(int i = 0; i < sizeof(def); i++) {

        if(def[i] == '\0') {
            continue;
        } 
        printf("[Число]: %d [Адрес]: %p\n",def[i], &def[i]);

    }
    printf("\n[Адрес указателя]: %p\n", &def);
    printf("[Адрес где хранится нулевой элемент массива]: %p\n", def);

    free(def);
    
    return 0;
}

Ответы (2 шт):

Автор решения: Cerbo

Ну давайте по порядку:

С помощью аллокатора я создаю динамическую память

Память вы не создаете, она уже создана на фабрике в Китае, память вы выделяете ну или точнее система вам выделяет.

все элементы массива я переношу в указатель "def"

Не в указатель, а по адресу в указателе.

Нет, адрес памяти которую вы выделили хранится в указателе. Указатель можно рассматривать как числовую переменную для хранения адресов, у этой переменной тоже есть свой адрес не связанный с выделенной памятью. Пример:

int * pointer = (int *)malloc(4 * sizeof(int));
int ** pointer_of_pointer = &pointer;     // адрес локальной переменной pointer
free(pointer);
→ Ссылка
Автор решения: Qwertiy

адрес памяти которую я выделил - это и есть адрес указателя ?

Нет.

Адрес выделенной памяти - это значение указателя. А адрес указателя - это адрес самого указателя и к выделенной памяти он никакого отношения не имеет. В данном случае, это адрес в стеке.

→ Ссылка