利用我在这里学到的:How to use realloc in a function in C,我编写了这个程序。

int data_length; // Keeps track of length of the dynamic array.
int n; // Keeps track of the number of elements in dynamic array.

void add(int x, int data[], int** test)
{

    n++;

    if (n > data_length)
    {
        data_length++;
        *test = realloc(*test, data_length * sizeof (int));
    }

    data[n-1] = x;

}

int main(void)
{

    int *data = malloc(2 * sizeof *data);

    data_length = 2; // Set the initial values.
    n = 0;

    add(0,data,&data);
    add(1,data,&data);
    add(2,data,&data);

    return 0;
}

程序的目标是有一个动态数组data,我可以不断地向其中添加值。当我试图将值添加到data时,如果它是完整的,则使用realloc增加数组的长度。
问题
此程序编译,运行时不会崩溃。但是,打印出data[0]data[1]data[2]会得到0,1,0。数字2未添加到数组中。
这是因为我错误地使用了realloc
附加信息
这个程序稍后将与不同数量的“add”和“remove”函数一起使用。另外,我知道应该检查realloc以查看它是否失败(isNULL),但为了简单起见,这里忽略了这一点。
我仍在学习和试验C。谢谢你的耐心。

最佳答案

您的问题在于使用data,因为它指向旧数组的地址。然后,当您的呼叫realloc时,此区域将被释放。因此,您试图在下一条指令中访问无效地址:这将导致未定义的行为。
您也不需要使用这个data指针。test就足够了。

(*test)[n-1] = x;

关于c - 在函数中使用realloc操作动态数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13749727/

10-14 18:42