首页 > 解决方案 > 使用 c 编写动态数组时,不同版本的 gcc 的输出不同

问题描述

我正在用c语言编写一个关于动态数组的程序,代码是:

#include <stdio.h>

struct Vector {
    int size;
    int capacity;
    int *arr;
};

void add(struct Vector *Arr, int data) {

    if (Arr->size == Arr->capacity) {
        Arr->capacity *= 2;
        int arr[Arr->capacity];

        //array copy
        for (int i = 0; i < Arr->size; i++) {
            arr[i] = Arr->arr[i];
        }

        Arr->arr = arr;
    }

    int size = Arr->size;
    Arr->arr[size] = data;
    Arr->size++;

}

void display(struct Vector *Arr) {
    for (int i = 0; i < Arr->size; i++) {
        printf("%d ", Arr->arr[i]);
    }
    printf("\n");
}

int main() {
    int arr[10];
    struct Vector
            array = {0, 10, arr};

    //fill the array
    for (int i = 0; i < 10; i++) {
        add(&array, i);
    }
    display(&array);
    //more element than the init size
    add(&array, 10);
    display(&array);    //where the error happened

    return 0;
}

当数组增长时,它有不同的输出,如下所示:

将 dev-cpp 与 gcc 4.9 一起使用:

gcc4.9

在 gcc8.2 中使用 vs 代码

gcc8.2

使用在线 c 编译器

在线编译器

最后一个是我的期望。

标签: cdynamic-arrays

解决方案


问题是你有未定义的行为,所以任何事情都可能发生。它可以在不同的机器或编译器上以不同的方式表现出来。考虑一下:

if (Arr->size == Arr->capacity) {
        Arr->capacity *= 2;
        int arr[Arr->capacity];
        ...
        Arr->arr = arr; // Arr->arr points to a local variable!

在这里,您正在创建一个新数组,然后将其地址分配给向量。但是,当该功能完成时,该内存将变得无效。相反,将其替换为:

int *arr = malloc(sizeof(int) * Arr->capacity);

你得到以下输出:

0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9 10

完成后不要忘记free它。为了让它正常工作,我建议将 to 更改int arr[10];int arr = malloc(10*sizeof(int));使数组永远不会在堆栈上,然后在程序末尾放置 afree(Arr->arr);和a Arr->arr = arr;free(array.arr);


推荐阅读