繁体   English   中英

在C中为char * [64]分配(和取消分配)内存

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM