[英]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
。
也就是說,對於代碼的其余部分(作為一般建議)
v[i]
不應導致內存溢出。 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.