将值分配给数组指针

时间:2020-02-26 06:39:02

标签: c arrays pointers

在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 :(得分:0)

#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 = 0x7ffffb7a696c,* p1 = 1,* p2 = 2

array [0] = 0x7ffffb7a6968,array [1] = 0x7ffffb7a696c

答案 1 :(得分:0)

您无需调用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

答案 2 :(得分:0)

尽管其他答案建议使用其他实现,但它们并未清楚说明示例中的错误是什么:node *(*node)[N];定义了指针node,但没有初始化它,因此{{1} }并不指向已分配的内存,行node中的后续*node的行为不确定。要在不更改其余代码的情况下进行纠正,可以编写

(*node)[i] = newNode(i);

相反。

答案 3 :(得分:0)

以下内容对我有用: 它类似于@armali的建议,但不是动态分配。

// 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()的调用中分配一个新节点,我们将其返回值保存在节点指针数组中。