[英]Allocating (and De-Allocating) Memory for char*[64] in C
我想知道如何在C中分配(和取消分配)一个char指针数组(char * [64])。我在网上四处查看示例,但它们都专注于其他数据类型或一维数组。
如果您想要固定大小的数组,则完全不需要使用动态分配的机会就很公平。 如果要动态分配它,则可以执行以下操作:
char **array;
array = malloc(64 * sizeof(char *));
当需要释放它时,您将像往常一样:
free(array);
但请注意,如果在任何在阵列点的指针(特别是动态分配的内存),你需要与释放内存分别处理-你的空闲指针数组通常之前 。
这可以在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;
}
您可以使用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]个字符的内存位置,您只需要进行一次分配,即更快地分配WAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY。 我为编译错误表示歉意,因为我没有对此进行测试。 要释放它,您只能释放aItems。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.