Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从数组中添加/删除元素_C_Arrays - Fatal编程技术网

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

我正在尝试用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(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
返回新指针,并在调用者中分配它。Like
elements=添加元素(元素,新元素,大小+1)
add_element(elements, new_element, size);
remove_element(elements, element_to_remove, size);
cvorovi = realloc(elements, size*sizeof(element));
elements[size-1] = cv;