-1

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

理想的:

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!
4

1 回答 1

2

您正在尝试做的事情称为动态内存分配。您当前使用char * DataArray[Buffer]的不是 C90 标准的一部分(不过,它是 C99 标准的一部分;它也是 C90 的 GCC 扩展),因此您可能不应该使用它。

要动态分配内存,请使用mallocfrom stdlib.h

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

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

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

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

free(DataArray);

但是,如果您丢失了指向您已获得的内存块的指针,那么您就无法free()做到这一点,并且您会遇到所谓的内存泄漏。动态内存分配可能会出现很多问题,您必须考虑这些问题。

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

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

于 2012-12-01T11:43:07.037 回答