我正在尝试在C中编写2个函数,其中一个函数会在我作为参数传递的数组末尾添加一个元素,另一个函数将从数组中删除一个元素作为参数传递。
我对C并不熟悉,也不熟悉指针算法。
我尝试过类似的东西,但似乎没有正常工作:
void remove_element(type *elements, type element, int size){
int i;
int index = 0;
for(i=0; i<size; i+=1){
if(equals(elements[i], element)) index = i;
}
for(i=index; i<size-1; i+=1){
elements[i] = elements[i+1];
}
}
void add_element(type *elements, type element, int size){
elements = realloc(elements, size*sizeof(element));
elements[size-1] = element;
}
这就是我想要调用函数的方法:
add_element(elements, new_element, size);
remove_element(elements, element_to_remove, size);
答案 0 :(得分:1)
这两行可能会导致未定义的行为:
cvorovi = realloc(elements, size*sizeof(element));
elements[size-1] = cv;
realloc
函数不能保证返回指向要重新分配的相同区域的指针,这意味着elements
可能不会在调用后指向分配的区域。 必须使用返回的指针。
这很可能会导致代码调用这个函数出现问题,因为该代码对指针的更改一无所知。通过引用传递elements
(即指向指针的指针)或返回新指针。
此外,在看到您的修改后,当您致电add_element
时, 记得传递的尺寸大于当前尺寸?否则它将一遍又一遍地重新分配相同的大小,并覆盖每次调用的最后插入的元素。您可能需要考虑使结构跟踪这些,以及将此结构作为参数并在内部处理所有事物(如跟踪大小)的特殊函数集。