void数组的指针

0xD*_*EEF 2 c arrays pointers void-pointers

我有一个void-Pointers数组,想要访问元素(初始化它们),但它不起作用:

void* anyptr = ...; //a pointer to something
void* arr = (void*)malloc(sizeof(void*)*10);

int i=0;
for(i=0; i<10; i++)
   *(arr+i) = anyptr; //dont work, (arr+n) = anyptr; doesn´t work too
Run Code Online (Sandbox Code Playgroud)

我想,这不起作用的原因是左侧是元素i的结果.但我不知道如何做到这一点

Joe*_*ado 17

有两种方法可以在C中初始化数组:

  • 堆栈上(它将为您处理内存,因为它将在您的功能结束时被清理)
  • 堆中(这将要求您自己处理分配和释放).

如果你想使用堆栈,你可以像这样初始化你的数组......

#define ARRAY_LENGTH 10
void *ptr;
void *arr[ARRAY_LENGTH];
for (int i = 0; i < ARRAY_LENGTH; i++) {
    arr[i] = ptr;
}
Run Code Online (Sandbox Code Playgroud)

您可以类似地在堆中定义您的数组,如下所示......

#define ARRAY_LENGTH 10
void *ptr;
void **arr = malloc(sizeof(void *) * ARRAY_LENGTH);
for (int i = 0; i < ARRAY_LENGTH; i++) {
    arr[i] = ptr;
}
free(arr);
Run Code Online (Sandbox Code Playgroud)

重要的是要记住一个数组(除了在堆栈中分配的数组,它有一些额外的属性,如长度)基本上只是指向第一个元素的指针,操作arr [i]与移动i*sizeof相同(elem)字节远离第一个元素,并访问那里的内存.如果你想获得一个指向数组中第i个索引的指针,那么你会使用诸如...之类的符号

void *indexPtr = arr + i;
Run Code Online (Sandbox Code Playgroud)

要么

void *indexPtr = &( arr[i] );
Run Code Online (Sandbox Code Playgroud)

以这种方式,void*的数组将是void**类型,因为该变量是指向数组的第一个成员的指针,该指针是指针.这可能有点令人困惑,但只是总是试着记住数组元素的类型,并创建指向它们的指针.因此,如果数组的类型为int,则该数组的类型为intint [],但如果要存储指向整数的指针,则可以在这两种形式中的任何一种中初始化int*类型的数组 ...

int **arr = malloc(sizeof(int *) * ARRAY_LENGTH);
int *arr[ARRAY_LENGTH];
Run Code Online (Sandbox Code Playgroud)

另请注意,您正在存储指针,因此如果您运行代码......

int *arr[4];
for (int i = 0; i < ARRAY_LENGTH; i++) {
    arr[i] = &i;
}
Run Code Online (Sandbox Code Playgroud)

虽然看起来数组中指出的值可能如下 - [0,1,2,3],但实际上它会是[4,4,4,4],因为你实际拥有的是是指向函数中变量i的指针数组,因此每当您更改它时,数组中指向的值都将被更改.
我希望这有帮助


Ale*_*nze 10

你需要改变这一行

void* arr = (void*)malloc(sizeof(void*)*10);
Run Code Online (Sandbox Code Playgroud)

对此

void** arr = malloc(sizeof(void*)*10);
Run Code Online (Sandbox Code Playgroud)

  • @init 因为这就是您要为其分配内存的内容:10 个指针。你如何指向这段记忆?你指向第一个指针。因此,它是一个指向指针的指针。你给它加 1,然后指向下一个指针,依此类推,直到 10 个指针中的最后一个。 (3认同)