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

时间:2010-06-07 20:54:18

标签: c memory-management

我想知道如何在C中分配(和De-Allocate)一个char指针数组(char * [64])。我在网上浏览了一些例子,但他们都关注其他数据类型或者一个维数组。

6 个答案:

答案 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更快。我为编译错误道歉,因为我没有测试这个。要释放它,你只需要释放一个项目。