对malloc的连续调用是否会在c中的前一次调用之后直接分配空间



我说的是使用char*和动态数组。具体来说,我想使用一个2d阵列来将一行命令和选项分解为它们的组件

例如:

char *dynamicArr = malloc(1 * sizeof(char));//allocate first letter
int i = 0;
while(string[i] != ''){
    dynamicArr[i] = string[i];
    //would I be able to allocate more memory onto the end of dynamicArr here?
}

显然,在这种情况下,我可以只使用strlen和strcpy,但我正在尝试使用各种标记"one_answers"来解析一行命令。因此,单个字符串不会以null结尾。我已经使用静态2d数组编写了它,但我想使它成为动态的,以便它可以处理任何大小的命令。

对malloc的连续调用会直接在c中的前一次调用之后分配空间吗?

没有。没有必要。malloc分配连续的内存块,但它不能保证对malloc的下一次调用将在前一次调用之后分配该块。

我已经用静态2d数组编写了它,但我想让它成为动态的,这样它就可以处理任何大小的命令。

使用realloc()函数。

//我是否可以在dynamicArr的末尾分配更多内存?

是的。dynamicArr的大小可以使用realloc()进行扩展。

否。绝对不是。

malloc分配的内存块不能保证其位置或与其他块的关系。之后可能会立即有空闲空间,但同样可能没有。没有办法扩展它,也没有办法确定它是否可以扩展。

相反,您可以使用realloc()。对realloc的调用将返回一个指向内存块的指针,就像malloc一样,同时保留传入的块的内容,但不一定在同一位置。根据请求的大小(更小、相同大小或更大)和堆中空间的可用性,realloc可能会根据需要返回大小调整后的原始块,也可能会返回不同位置的新块。在后一种情况下,realloc将把旧的内容复制到新的块中。

需要记住的重要一点是,realloc返回的指针可能不同,因此您必须假设它会是,并相应地进行编码。

然而,realloc相对昂贵,不应逐个字符调用。解决问题的典型方法是读取足够大的临时缓冲区,分配正确大小的内存并复制数据。在C++中,你可以使用字符串或字符向量,这样可以省去很多悲伤。

相关内容

  • 没有找到相关文章

最新更新