为双指针声明和分配内存(char **)

时间:2012-12-01 11:30:47

标签: c memory-management multidimensional-array forward-declaration

我有一个程序要求我将大量数据读入一个字符串数组,并且初始函数的一部分用于声明所有变量。问题是我不知道字符串数组的实际大小,直到函数的后面,所以不要在查找数组长度的行下面声明它;我想定义上面的变量然后在行之后分配内存。我的想法是:

理想:

int declaration;
Char ** DataArray;  //initial declaration at top of file
char * usage;
int Buffer;

//function continues.....

Buffer = SomeNum; //find length of array needed

//allocate ideal size of array(HOW?)

我目前在做什么:

int declaration; //not placing the declaration here, bad programming practice especially
char * usage;    //considering this is an open source project i am working on.
int Buffer;

//function continues.....

Buffer = SomeNum;
char * DataArray[Buffer]; //works, but NOT ideal!

1 个答案:

答案 0 :(得分:2)

您尝试执行的操作称为动态内存分配。你目前使用char * DataArray[Buffer]做的事情不是C90标准的一部分(它是C99标准的一部分;它也是C90的GCC扩展),所以你可能不应该使用它。

要动态分配内存,请使用malloc中的stdlib.h

DataArray = malloc(num_elements * sizeof(char *));

malloc()void *返回到系统提供给您的内存块的开头。将其分配给DataArray(类型为char *)会将其转换为char *

然后,您可以使用DataArrayDataArray + index引用DataArray[index]中的元素,就像使用常规数组一样。

与静态分配的内存不同,动态分配的内存不会在声明它的块的末尾自动释放。因此,当你完成它时,你必须使用free()来释放它。

free(DataArray);

如果你丢失了指向你已经给出的内存块的指针,你就不能free()它并且你已经得到了所谓的内存泄漏。动态内存分配有很多问题需要考虑。

例如,系统可能根本没有足够的内存来给你(或者有足够的,但不是连续的块)。在这种情况下,malloc()将返回NULL,当然您不应该取消引用。

内存管理可能非常复杂,因此您可能最好在书的帮助下学习它,而不仅仅是通过反复试验。这种方式肯定不会那么令人沮丧。