簡體   English   中英

函數內部的數組聲明

[英]Array declaration inside a function

編寫如下代碼是否安全?

void func(int v[], int size) {
 int array_local[size];

 for(int i = 0; i < size; i++) array_local[i] = v[i];

 /*
 Other stuff...
 */

}

還是我會偶然發現某種錯誤?

只要調用者確保v至少具有size元素,它是安全的,否則當然會引起問題,您不必擔心,因為無論如何您都無能為力。

您還必須注意不要返回array_local ,因為它將在函數返回時被釋放,因為它是在函數堆棧框架中分配的。

另外,上面的代碼不是復制數組所必需的,您可以

memcpy(array_local, v, size * sizeof(int));

是的,這在C99上及以上都非常好並且有效。 它稱為VLA

為了安全起見,您應先檢查size的值,然后再將其用作數組的元素數。 由於您將size定義為int ,因此應禁止將say -5的值傳遞給size

也就是說,對於代碼的其余部分(作為一般建議)

  1. v[i]不應導致內存溢出。
  2. 該數組在函數本地。 您永遠不要嘗試返回數組的地址 (通過指針或通過return語句)。

這稱為Variable Length Array ,它們僅存在於C99中。 因此,只要您的編譯器支持-c99編譯標志並且您正在使用它,該代碼就有效。

至於是否應該使用它,取決於您期望的size 使用堆棧分配,您無法避免分配過多的內存。 如果要使用動態分配器(如malloc ,則可以檢查是否有NULL返回值,而對於VLA ,如果您要求太多,則只會破壞堆棧。 如果size較小,則沒有問題。

您可以使用動態內存分配以其他方式實現相同的事情,並且可以安全地實現:

void func(int v[], int size) {
 int *array_local = (int*)malloc(sizeof(int) * size);

 for(int i = 0; i < size; i++) *(array_local + i) = *(v + i);

 /*
 Other stuff...
 */

}

暫無
暫無

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

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