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