Присвоить значение указателю массива - PullRequest
1 голос
/ 26 февраля 2020

В C, если у меня есть указатель на массив указателей, как мне назначить указатель на объект, который будет элементом массива указателей?

Я пробовал что-то вроде этого: ( Примечание: arrayPointer - это указатель на массив указателей)

(*arrayPointer)[i] = pointer;

Но это не сработало. Это дает мне ошибки в сегменте памяти. Затем я попробовал это:

(*arrayPointer + i) = pointer;

Не компилируется.

Вот пример, аналогичный моему вопросу:

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

typedef struct node{
    int index;
} node;

node* newNode(int i){
    node* new = malloc(sizeof(node));
    return new;
}

// Create a pointer to an array of node pointers
node *(*create(int N))[]{
    int i;
    node *(*node)[N];

    for(i = 0; i < N; i++){
        (*node)[i] = newNode(i);
    }
    return node;
}

int main(){
    node *(*nodes)[8] = create(8);
}

Я использовал gdb для проверки:

Program received signal SIGSEGV, Segmentation fault.                         
0x0000000000400599 in create (N=8) at main.c:20                              
20              (*node)[i] = newNode(i); 

Ответы [ 4 ]

0 голосов
/ 28 февраля 2020

Для меня сработало следующее: Это похоже на то, что предложил @armali, но не динамическое распределение c.

// Create a pointer to an array of node pointers
node *(*create(int N))[]{
    int i;
    node *(*node)[N] = malloc(sizeof *node); // pointer to an array of node pointers

    for(i = 0; i < N; i++){
            (node_array)[i] = newNode(i);
    }
    return node;
}

Объяснение выглядит так:

node *(*node)[N]; // pointer to an array of node pointers

Это указатель на массив указателей узлов Так что это должно указывать массив указателей узлов. Поэтому сначала объявляем

Мы выделяем указатели узлов и сохраняем их в узле *

node *(*node)[N] = malloc(sizeof *node);

Вы выделяете новый узел при вызове newNode(), возвращаемое значение которого мы сохраняем в массив указателей узлов.

0 голосов
/ 26 февраля 2020

Вам не нужно вызывать значение, на которое указывает arrayPointer, достаточно просто вызвать его первый элемент.

Рассмотрим следующий пример:

int foo = 1;
int* pointer = &foo;
printf("pointer = %p\n", pointer);

int* arrayPointer[3]; // Arbitrary length
arrayPointer[0] = pointer; // Like in your code
printf("arrayPointer[0] = %p", arrayPointer[0]);

Какие выходные данные:

pointer = 0x7ffc17b109b4
arrayPointer[0] = 0x7ffc17b109b4 // The same pointer
0 голосов
/ 26 февраля 2020

В то время как другие ответы предлагают альтернативные реализации, они не ясно указывают, что ошибка в примере: node *(*node)[N]; определяет указатель node, но не инициализирует его, поэтому node не указывает на выделенная память и последующие *node в строке (*node)[i] = newNode(i); ведут себя неопределенно. Чтобы исправить это без изменения остальной части кода, вы можете написать

    node *(*node)[N] = malloc(sizeof *node);

.

0 голосов
/ 26 февраля 2020
#include <stdio.h>
#include <stdlib.h>

int main()
{
        void **array;
        int *p1, *p2;
        int temp1 = 1, temp2 = 2;

        p1 = (int *)malloc(sizeof(int));
        p2 = (int *)malloc(sizeof(int));

        p1 = &temp1;
        p2 = &temp2;

        array[0] = p1;
        array[1] = p2;

        printf("\np1 = %p, p2 = %p, *p1 = %d, *p2 = %d", p1, p2, *p1, *p2);

        printf("\n array[0] = %p, array[1] = %p", array[0], array[1]);
        return 0;
}

Приведенный выше код является примером массива указателей.

Вывод:

p1 = 0x7ffffb7a6968, p2 = 0x7ffffb7a696 c, * p1 = 1, * p2 = 2

массив [0] = 0x7ffffb7a6968, массив [1] = 0x7ffffb7a696 c

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...