【问题标题】:C malloc, realloc. How to remove single element from array.C malloc,重新分配。如何从数组中删除单个元素。
【发布时间】:2018-10-27 19:31:07
【问题描述】:

我有一个作业要创建 2 个函数 add 将元素添加到动态数组(我所做的)和 remove 从该数组中删除指定的元素.我对第二个功能有疑问。我不知道如何编码。 PS。我不能使用 memmove()。

#include <stdlib.h>
#include <stdio.h>

void print_array(int *tab, int n);
void add(int x, int y, int *tab, int idx);
void remove_element(int *tab, int idx, int array_length);


int main() {
        int *tab = malloc(24*sizeof(*tab));
        int  idx = 0;

        tab[idx++] = 44;
        tab[idx++] = 82;
        tab[idx++] = 57;
        tab[idx++] = 77;

        printf("Before insert\n");
        print_array(tab, idx);

        idx++;
        add(7, 0, tab, idx);

        printf("After insert\n");
        print_array(tab, idx);
        free(tab);

        idx--;
        printf("After delete\n");
        remove_element(tab, 3, idx);

        print_array(tab, idx);
        free(tab);
    return(0);
}

void print_array(int *tab, int n) {
    int i;
    for (i = 0; i < n; i++) {
        printf("t[%d] = %d\n", i, tab[i]);
    }
}

void add(int x, int y, int *tab, int idx) {
        int i;
        for (i = idx; i > y; i--) {
            tab[i] = tab[i-1];
        }
        tab[y] = x;
}


void remove_element(int *tab, int idx, int array_length) {
    void *tmp = realloc(tab, (array_length - 1) * sizeof(int) );
    array_length = array_length - 1;
    tab = tmp;
}

【问题讨论】:

  • 任何好书、教程或老师都应该告诉你,C 中的参数是按值传递的。这意味着它们被复制,并且函数只有副本。修改副本将不会修改原始文件。现在考虑一下与您的 remove_element 函数相关的问题,并针对在 C 中模拟通过引用传递进行一些研究。
  • 只是一个评论。 add 函数不会创建新内存,但 remove 函数会减少内存。它看起来不是一个健壮的设计

标签: c arrays dynamic malloc realloc


【解决方案1】:

关于您的数组,您可以保留有关其大小(例如iSize)和正在使用的元素数量(例如iUse)的信息。 iUse&lt;=isize,当然。

当你需要添加一个元素但数组太小(iUse==iSize)时,你增加它的大小,添加元素并增加iUse

当你删除一个元素时,你只需递减iUse,如果你不能使用memmov,则创建一个循环来向下移动所有更高的元素。

【讨论】:

  • 如何获得动态数组的大小?我试过 sizeof(array)/sizeof(array[0])。我发现它返回的是指针的大小而不是数组的大小。
  • @Aza:你无法获得动态分配内存的大小。您需要明确跟踪分配的大小。
  • 我说您可以保留有关...的信息,这意味着您在分配和重新分配时自己跟踪它。例如,您在 main 中的第一个分配是 24 个整数。
猜你喜欢
  • 1970-01-01
  • 2010-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-09
相关资源
最近更新 更多