是否有任何方法(除malloc
)用於創建一個用戶輸入大小的數組?有沒有辦法在c中創建一個長度可變的數組?
7
A
回答
2
一種方法是使用VLA(C99定義了所謂的「可變長度陣列」)。
下面是一個例子:
#include <stdio.h>
int use_a_vla (int n)
{
int vla[n]; /* Array length is derived from function argument. */
vla[0] = 10;
vla[n-1] = 10;
return 0;
}
int main (void)
{
int i;
scanf ("%d", &i); /* User input. */
use_a_vla (i);
}
6
這一切都取決於編譯器。
可變長度自動數組被允許在
ISO C99
,並作爲擴展 GCC 接受它們C90模式和C++。這些數組 與其他自動數組一樣聲明,但其長度不是常量表達式。存儲在 聲明處分配,並在退出支架級別時解除分配。對於 例如:
FILE *
concat_fopen (char *s1, char *s2, char *mode)
{
char str[strlen (s1) + strlen (s2) + 1];
strcpy (str, s1);
strcat (str, s2);
return fopen (str, mode);
}
更多信息請參見this。
0
嗯,這是迂腐,但你可以寫你自己的堆管理代碼,並調用你的內存分配函數除malloc()以外的東西。我希望這個答案有趣而不是煩人。
1
如果你沒有VLAS或alloca()
,這裏是一個非常缺憾,但便攜,基於堆棧的技術:
int foo(int size)
{
if (size <= 64*1024)
{
unsigned char arr[64*1024];
return bar(arr, size);
}
else if (size <= 1*1024*1024)
{
unsigned char arr[1*1024*1024];
return bar(arr, size);
}
else if (size <= 64*1024*1024)
{
unsigned char arr[64*1024*1024];
return bar(arr, size);
}
else
return -1; // Assume it's too big
}
int bar(unsigned char arr[], int size)
{
...your code goes here...
}
int maincode(int size)
{
// Invoke bar() indirectly, allocating an array
// on the stack of at least 'size' bytes
return foo(size);
}
我並不特別推薦這種技術,但它會給你不同在堆棧上分配的大小內存塊,而不是堆。
0
我假設你試圖避免malloc
,因爲你不知道realloc
。
本質上,你應該試圖做大致的C++向量。一旦你的陣列增長到一定的大小,realloc
它的大小是它的兩倍。如果可能的話
realloc
將增長你的內存塊,如果沒有可能它會malloc
一個新的跨越和複製內容。
相關問題
- 1. 在C#中,有沒有辦法將數組傳遞給一個可變長度參數的方法?
- 2. 如何在java中創建一個沒有長度的數組?
- 3. 有沒有辦法創建一個不可變(只讀)的XDocument?
- 4. Django - 有沒有辦法在模板中創建一個變量?
- 5. 有沒有辦法在android spinner中創建一個選項組?
- 6. 有沒有辦法在Zend2中創建一個組合框
- 7. 有沒有辦法在c#中創建一個sqllocaldb實例?
- 8. 有沒有辦法在一個數組
- 9. 有沒有辦法在一個數組
- 10. 有沒有辦法在Java中查找變量的長度?
- 11. 創建一個帶有數組長度的Javascript變量
- 12. 有沒有辦法在foreach循環中創建一個數組中的對象
- 13. 有沒有辦法創建一個分組的命名範圍?
- 14. 有沒有辦法創建一個沒有JS的消息框?
- 15. 有沒有辦法從一個範圍創建一個非null數組?
- 16. C++:可變長度數組
- 17. 可變長度c數組
- 18. 是否有可能在JavaScript中創建一個固定長度的數組?
- 19. 有沒有辦法在CSS中創建一個克隆?
- 20. 有沒有辦法在Visual Studio中創建另一個項目?
- 21. 有沒有辦法在Slick中創建一個聚類索引?
- 22. 有沒有辦法在numpy.hist中返回相同長度的數組?
- 23. 有沒有辦法在SQL Server中創建自己的@@變量?
- 24. 有沒有一種方法可以在Python中創建保持長度固定的數組?
- 25. 創建一個可變長度數組需要幫助
- 26. 有沒有辦法讓一個數組保存c中的其他數組?
- 27. 在C++中有可變長度數組嗎?
- 28. C++ 14中的可變長度數組?
- 29. 有沒有辦法在TCL 8.4中創建一個字典全局變量8.4
- 30. 有沒有辦法爲函數創建一個預處理宏?
您需要一個支持它的編譯器並啓用正確的選項。但是在你做之前要注意VLA的缺點。 – Mysticial
爲什麼你不想使用'malloc()'? –
我想知道是否有任何其他方式這樣做。 – rippy