簡體   English   中英

動態數組(GCC)和指針之間的區別

[英]Difference between dynamic arrays (GCC) and pointers

考慮以下代碼:

void foo() {
    int arraySize = getMyComputedValue();
    int dynamicArray[arraySize];

    fillDynamicArray(&dynamicArray[0]);

    for (int i = 0; i < arraySize; i++) {
        // Do something with data
    }
}

void bar() {
    int arraySize = getMyComputedValue();
    int* dynamicArray = new int[arraySize];

    fillDynamicArray(dynamicArray);

    for (int i = 0; i < arraySize; i++) {
        // Do something with data
    }

    delete[] dynamicArray;
    dynamicArray = NULL;
}

兩者都在內存中創建一個動態區域,長度可變,包含整數。 我發現第一個示例foo() (至少在我的構建環境中)僅使用GCC進行編譯。

兩者之間的確切區別是什么? 第一個示例僅僅是GNU擴展,它是下一個示例的簡寫 ,允許編譯器確定何時正確的解除分配時間? 還是第一個示例完全按照代碼中的說明進行操作並在堆棧上分配內存?

  1. foo()在堆棧上分配內存, bar()在堆上分配內存。 這有兩個影響:生命周期(函數退出時自動回收堆棧內存),以及最大數組大小(堆棧空間最多只能限制在幾MB范圍內,堆空間僅受可用RAM限制)。

  2. foo()是有效的C99,但不是任何標准的C ++。 C ++根本就不接受VLA。 這是您需要意識到C和C ++是兩種截然不同的語言的核心點。 有一些不是C ++的有效C程序(如foo() ),有一些不是C的有效C ++程序(如bar() )。 C ++從它開始時就不再是嚴格的超集。

但是,編譯器可能選擇將語言的超集實現為擴展。 g++ g++ -std=c++14 -pedantic -Werror ,但是如果您遵循嚴格的C ++標准合規性進行編譯( g++ -std=c++14 -pedantic -Werror ),即使g++也會在foo()上引發錯誤。

暫無
暫無

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

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