簡體   English   中英

當使用c代碼動態數組時,不同版本的gcc輸出不同

[英]different output with different version of gcc, when code dynamic array using c

我正在用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;
}

當數組增長時,它具有不同的輸出,如下所示:

在gcc 4.9中使用dev-cpp:

gcc4.9

在gcc8.2中使用vs代碼

gcc8.2

使用在線c編譯器

在線編譯器

最后一個是我的期望。

問題是您的行為不確定,因此任何事情都可能發生。 它可以在不同的機器或編譯器上以不同的方式體現。 考慮一下:

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它。 為了int arr[10];正常工作,我建議更改int arr[10]; int arr = malloc(10*sizeof(int)); 所以數組永遠不會在堆棧上,然后放一個free(Arr->arr); Arr->arr = arr; 以及一個free(array.arr); 在程序結束時。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM