我有一个程序要求我将大量数据读入一个字符串数组,并且初始函数的一部分用于声明所有变量。问题是我不知道字符串数组的实际大小,直到函数的后面,所以不要在查找数组长度的行下面声明它;我想定义上面的变量然后在行之后分配内存。我的想法是:
理想:
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!
答案 0 :(得分:2)
您尝试执行的操作称为动态内存分配。你目前使用char * DataArray[Buffer]
做的事情不是C90标准的一部分(它是C99标准的一部分;它也是C90的GCC扩展),所以你可能不应该使用它。
要动态分配内存,请使用malloc
中的stdlib.h
:
DataArray = malloc(num_elements * sizeof(char *));
malloc()
将void *
返回到系统提供给您的内存块的开头。将其分配给DataArray
(类型为char *
)会将其转换为char *
。
然后,您可以使用DataArray
或DataArray + index
引用DataArray[index]
中的元素,就像使用常规数组一样。
与静态分配的内存不同,动态分配的内存不会在声明它的块的末尾自动释放。因此,当你完成它时,你必须使用free()
来释放它。
free(DataArray);
如果你丢失了指向你已经给出的内存块的指针,你就不能free()
它并且你已经得到了所谓的内存泄漏。动态内存分配有很多问题需要考虑。
例如,系统可能根本没有足够的内存来给你(或者有足够的,但不是连续的块)。在这种情况下,malloc()
将返回NULL
,当然您不应该取消引用。
内存管理可能非常复杂,因此您可能最好在书的帮助下学习它,而不仅仅是通过反复试验。这种方式肯定不会那么令人沮丧。