【发布时间】:2011-04-26 10:29:54
【问题描述】:
在一些指针算术上遇到了相当大的麻烦。我认为我得到了概念(指针变量指向内存地址,普通变量指向数据)但我相信我的问题在于语法(*, &, (*), *(), 等)
我想要做的是构建自定义结构的动态数组(即指向堆结构的指针数组),我的接口提供了两种方法,“ad_to_obj_array”(它需要添加对象和可以为空的数组为空)和“obj_array_dustbin”(它只需要处理数组,也处理内容,堆对象)。前者如下图。
对象的细节并不重要(并且结构已经被重命名),但我对一般问题的解决方案如下,如果您能发现错误,我将不胜感激。编译器抱怨左值无效,我尝试将 RHS 指针中的地址分配给指向堆结构的指针数组中的指针值:
#define NUM_ELEM(x) (sizeof (x) / sizeof (*(x)))
obj* add_to_obj_array(obj* new_obj, obj* array)
{
int number_of_elements = 0;
if (array != NULL)
{
number_of_elements = NUM_ELEM(array);
}
obj* new_array = NULL;
/* note: I am expecting sizeof(new_obj) to return the size of an obj*
to go into the array of pointers. */
if ( NULL ==
(new_array = (obj*)malloc((number_of_elements + 1)* sizeof(new_obj))) )
{
/* memory request refused :( */
return NULL;
}
/* copy the old array pointers into the new array's pointer slots: */
int i;
for (i = 0; i < number_of_elements; i++)
{
&(new_array[i]) = &(array[i]);
}
/* add the new item to the end (assign pointer value directly): */
new_array[number_of_elements] = new_obj;
if (number_of_elements > 0)
{
free(&array);
}
return new_array;
}
现在,我尝试了以下违规行的排列:
&(new_array[i]) = &(array[i]);
*(new_array[i]) = &(array[i]);
new_array[i] = &(array[i]);
并且都给出了一种或另一种编译器错误。我相当确定右侧是旧数组的第 i 个元素的地址,但是当数组的元素是指向结构的指针时,如何分配给新的第 i 个元素?
编辑 - 请注意,上面的宏 NUM_ELEM 不起作用;它总是会返回 1。请参阅下面的@Merlyn Morgan-Graham 的回答了解原因。
【问题讨论】:
标签: c arrays pointers variable-assignment struct