簡體   English   中英

如果我們在c99編譯期間不知道數組的長度,可以靜態分配數組嗎?

[英]Can an array be statically alocated if we don't know the length of the array during compilation in c99?

我不確定這是否正確,我舉了一個例子來說明我的意思:

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

int main(int argc, char** argv){
    int duzina;
    duzina = strlen(argv[1]);

    char novi[duzina+1];
    strcpy(novi, argv[1]);
    printf("%s\n", novi);

    return 0;
}

我編譯並運行它,它按預期執行,但我不確定這是否正確使用 static 分配。

您代碼中的novi數組具有自動存儲持續時間並且沒有鏈接 它不是“靜態分配的”。 它是一個可變長度數組,因為它的長度是在運行時確定的。

具有static 存儲持續時間的數組的長度在編譯時確定,不能在運行時更改。

您的代碼唯一的問題是它沒有檢查命令行 arguments 的數量,因此argv[1]可能是 null 指針 [*] 和strlen(argv[1]); 然后會調用未定義的行為


[*] 從技術上講, argv[1]甚至可能超出argv數組的范圍。 只存在直到argv[argc]的元素,其中argv[argc]是 null 指針。 盡管大多數代碼假定argc > 0 ,但argc可能為 0,盡管不太可能。

這樣做完全沒有問題。

Actually you are not statically allocating memory (the static keyword in file scope, outside of a function, is optional but it is not in function scope, inside of a function). 相反,您將自動分配 memory

自動 memory 分配發生在函數內部定義的(非靜態)變量上,通常存儲在堆棧中(盡管 C 標准不要求使用堆棧)。 您不必使用它們保留額外的 memory,但另一方面,也可以有限地控制此 memory 的生命周期。 例如:function 中的自動變量只存在於 function 完成之前。

另請參見static memory 分配和動態 memory 分配之間的區別

您的代碼的唯一限制是您將無法使用realloc()調整數組的大小,但如果您不需要,這非常好。

暫無
暫無

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

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