我想知道如何我可以在C中分配(和取消分配)字符指針數組(char * [64])。看看網絡上的例子,但他們都關注其他數據類型或一維數組。分配(和取消分配)內存char * [64]在C
回答
這回答在The C FAQ。
下面是代碼適用於char *而不是int *的一些示例數據。
#include <stdlib.h>
#define nrows 10
#define ncolumns 64
int main(int argc, char* argv[])
{
int i;
//allocate 10 char*
char **array1 = (char**)calloc(nrows,sizeof(char*));
for(i = 0; i < nrows; i++)
{
//allocate 64 chars in each row
array1[i] = (char*)calloc(ncolumns,sizeof(char));
sprintf_s(array1[i],numcolumns,"foo%d",i);
}
for(i=0;i<nrows;i++)
printf("%s\n",array1[i]);
//prints:
// foo0
// foo1
// ..
// foo9
for(i=0;i<nrows;i++)
free(array1[i]);
free(array1);
return 0;
}
其實我已經計劃在64個字符*(或10或其他),但謝謝。這正是我需要的! – Lienau 2010-06-07 21:34:53
使用calloc優於malloc 的優點是它在分配時清零內存。因此Coleman使用calloc是一個很好的防禦措施。 一個不經意的未初始化的指針,其值爲0 是一個比值 是不可預知的值小得多的危險錯誤。隨機指針可能導致極其難以追蹤錯誤。 – pbernatchez 2010-06-08 04:24:31
如果你想要一個固定大小的數組,那麼根本不需要使用動態分配的機會是相當公平的。如果你要動態地分配它,你會做這樣的事情:
char **array;
array = malloc(64 * sizeof(char *));
當它的時間來釋放它,你只是不喜歡平常:
free(array);
注意,但是,如果數組中的指針指向處的任何東西(尤其是動態分配的內存),則需要單獨處理以釋放該內存 - 通常在之前可釋放指針數組。
您使用malloc在堆上分配內存:
char** pPointers;
pPointers = malloc(sizeof(char*) * 64);
現在你有64個指針字符(多個)的陣列。
你釋放內存與此調用:
free(pPointers);
你可能值分配給您的數組:
pPointers[0] = "abc";
pPointers[1] = &cSampleCharVariable;
pPointers[2] = strdup("123");
解放出來這個內存取決於指針指向什麼。在上面的示例中,只有pPointers [2]可以被解除分配。
如果你在你的問題中給出的類型:
char *foo[64];
然後,你不需要爲foo
明確地分配內存 - 這是一個正常的陣列。要在foo
爲指針分配內存,只需使用一個循環:
int i;
for (i = 0; i < 64; i++)
{
foo[i] = malloc(somesize);
}
(你真的不應該使用魔法值64
在循環,雖然,無論是使用#define FOOSIZE 64
,或使用sizeof foo/sizeof foo[0]
確定數組的大小)。
在被明顯(比其他答案一般較少)的風險,sizeof (char * [64])
等於64 * sizeof (char *)
,所以你可以只寫p = malloc (sizeof (char * [64]))
分配內存和free (p)
釋放它。
做65個接受答案的分配是可行的,但是如果你提前知道char數據的長度,你可以通過做這樣的事情來讓它變得更快。
假設cItems是int即陣列中元件的數量,比如64假定aItemSizes []包含char數據的長度爲您的陣列中的每個元素:
int iItem;
char **aItems, *pData;
for (cbCharData=iItem=0; iItem<cItems ; iItem++)
cbCharData += aItemSizes[iItem];
aItems = (char**)malloc(sizeof(char*)*cItems + cbCharData);
for (iItem=0, pData=&aItems[cItems] ; iItem<cItems ; pData+=aItemSizes[iItem], iItem++)
aItem[iItem] = pData;
現在aItem [ iItem]指向一個內存位置,該位置可以處理達到aItemSizes [iItem]字符,並且您只需要一個分配,即WAAAAAAAAAAAAAAAAAAAAAAAAAAY更快。我道歉編譯錯誤因爲我沒有測試這個。要釋放它,你只能釋放一個項目。
- 1. C內存分配 - char *和char sizeof
- 2. int char *和內存分配
- 3. 內存分配/取消分配UIViewController.view
- 4. 取消分配和重新分配內存。在FLTK
- 5. C#關於範圍的內存分配/取消分配問題
- 6. 64位內存分配
- 7. 64位機內存分配
- 8. 將內存分配給C++中的char *
- 9. 將內存分配給char * C語言
- 10. 使用C#和C++非託管時的內存分配/取消分配
- 11. C++ char分配
- 12. C++內存分配在C
- 13. 內存分配C++
- 14. 內存分配,C++
- 15. C內存分配
- 16. C++分配內存
- 17. 內存分配C
- 18. 分配內存和保存串在C
- 19. C++內存分配 - 分配子類到
- 20. Fortran分配/取消分配
- 21. Java中的內存分配/取消分配
- 22. 內存分配在C
- 23. 內存分配在C#
- 24. 內存分配在obj c
- 25. 在C++中用void *分配內存結構內存分配
- 26. 如何取消分配內存?
- 27. CArray沒有取消分配內存
- 28. 如何取消分配內存?
- 29. 如何取消分配數組內存?
- 30. 取消分配CGContextDrawPDFPage使用的內存
'char * [64]'*是*一維數組類型。它的分配方式與分配任何其他一維數組的方式完全相同。 – AnT 2010-06-07 20:56:19