C 从数组中添加/删除元素
我正在尝试用C编写两个函数,其中一个函数将在数组末尾添加一个元素作为参数传递,另一个函数将从作为参数传递的数组中删除一个元素 我对C不太熟悉,对指针算法也不太了解 我尝试过类似的方法,但似乎无法正常工作:C 从数组中添加/删除元素,c,arrays,C,Arrays,我正在尝试用C编写两个函数,其中一个函数将在数组末尾添加一个元素作为参数传递,另一个函数将从作为参数传递的数组中删除一个元素 我对C不太熟悉,对指针算法也不太了解 我尝试过类似的方法,但似乎无法正常工作: void remove_element(type *elements, type element, int size){ int i; int index = 0; for(i=0; i<size; i+=1){ if(equals(element
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;
}
这两条线可能导致未定义的行为:
realloc
函数不能保证返回指向要重新分配的相同区域的指针,这意味着元素在调用后可能不会指向分配的区域。必须使用返回的指针
这很可能会导致调用此函数的代码出现问题,因为该代码对指针的更改一无所知。通过引用传递元素
(即指向指针的指针)或返回新指针
此外,在查看编辑后,在调用add_element
?否则,它只会一次又一次地重新分配相同的大小,并在每次调用时覆盖最后插入的元素。您可能想考虑构造一个结构来跟踪这些,以及一组特殊的函数集,这些函数将这个结构作为参数,并处理内部的所有事情(如跟踪大小)。您可能还想展示一些代码,说明如何使用这些函数,请阅读,例如,您的代码看起来并没有实际放入数组中。请描述“它似乎工作不正常”。你给了你的程序什么输入?你期望得到什么结果?你到底得到了什么结果?我在代码中只看到两个函数。没有main
,没有输入,没有任何类型的输出。您的add\u element()
函数分配一个新数组,但它从不将其返回给调用者。每次添加元素时调用realloc()
似乎是非常糟糕的设计。您应该使用一种跟踪分配的大小和正在使用的元素数量的结构,并且只在需要超过该大小时才重新分配。实际上,这行代码如下所示:elements=realloc(elements,size*sizeof(element));原来的一行是打字错误。@Whizzil,但答案的最后一部分仍然有效。调用代码如何知道可能的更改?我希望有一个解决方案,一个实际的代码,它将如何工作我想要的,这样会更清楚@编辑:是的,我确实记得:)@Whizzil只需从add_element
返回新指针,并在调用者中分配它。Likeelements=添加元素(元素,新元素,大小+1)代码>
add_element(elements, new_element, size);
remove_element(elements, element_to_remove, size);
cvorovi = realloc(elements, size*sizeof(element));
elements[size-1] = cv;