gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:59:07 27 4
gpt4 key购买 nike

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

理想:

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!

最佳答案

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

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

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

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

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

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

free(DataArray);

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

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

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

关于c - 为双指针 (char**) 声明和分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13658989/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com