void数组的指针

时间:2013-04-20 19:02:46

标签: 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

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

3 个答案:

答案 0 :(得分:17)

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

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

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

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

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

#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);

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

void *indexPtr = arr + i;

void *indexPtr = &( arr[i] );

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

int **arr = malloc(sizeof(int *) * ARRAY_LENGTH);
int *arr[ARRAY_LENGTH];

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

int *arr[4];
for (int i = 0; i < ARRAY_LENGTH; i++) {
    arr[i] = &i;
}

虽然看起来数组中指出的值可能如下 - [0,1,2,3],但实际上它会是[4,4,4,4],因为你实际拥有的是一个指针数组,它们都指向函数中的变量 i ,所以无论何时更改它,数组中指向的值都将被更改。 我希望这有帮助

答案 1 :(得分:9)

您需要更改此行

void* arr = (void*)malloc(sizeof(void*)*10);

到这个

void** arr = malloc(sizeof(void*)*10);

答案 2 :(得分:1)

您无法取消引用void指针。这就是无效指针的重点。 通过取消引用指针,您可以访问在指针指向的地址处找到的项目。但是,使用void指针,您不知道目标对象有多大(它是1B字符还是100B结构?)。在解除引用之前,必须将其强制转换为特定的指针类型。

向指针添加(或减去)整数 i 然后被定义为将i-times sizeof(*指针)添加到指针的内容。 (如果指针具有特定类型,则只能告诉sizeof(*指针)。使用void指针的指针算法没有意义。)

至于(arr + n)= anyptr;,arr + n只是一个地址。这不是你可以分配东西的价值(不是左值)。