我想知道如何在C中分配(和De-Allocate)一个char指针数组(char * [64])。我在网上浏览了一些例子,但他们都关注其他数据类型或者一个维数组。
答案 0 :(得分:1)
如果你想要一个固定大小的数组,你可能根本不需要使用动态分配。如果您要动态分配它,您可以执行以下操作:
char **array;
array = malloc(64 * sizeof(char *));
到了释放它的时候,你就像往常一样:
free(array);
但是,请注意,如果数组中的指针指向 at 任何内容(特别是动态分配的内存),则需要单独处理释放内存 - 通常之前你释放了指针数组。
答案 1 :(得分:1)
这是在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;
}
答案 2 :(得分:0)
使用malloc:
在堆上分配内存char** pPointers;
pPointers = malloc(sizeof(char*) * 64);
现在你有一个包含64个字符指针的数组。
您通过此调用取消分配内存:
free(pPointers);
您可能会为数组指定值:
pPointers[0] = "abc";
pPointers[1] = &cSampleCharVariable;
pPointers[2] = strdup("123");
释放此内存取决于指针指向的内容。在上面的样本中,只有pPointers [2]可以解除分配。
答案 3 :(得分:0)
如果您的问题中有类型:
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]
来确定数组的大小。 / p>
答案 4 :(得分:0)
存在明显的风险(并且不如其他答案一般),sizeof ( char * [64] )
等于64 * sizeof ( char * )
,因此您只需编写p = malloc ( sizeof ( char * [64] ) )
来分配内存和{{ 1}}释放它。
答案 5 :(得分:0)
对接受的答案进行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更快。我为编译错误道歉,因为我没有测试这个。要释放它,你只需要释放一个项目。