我正在谈论使用 char* 和动态数组。具体来说,我想使用二维数组将一行命令和选项分解为它们的组件
例如:
char *dynamicArr = malloc(1 * sizeof(char));//allocate first letter
int i = 0;
while(string[i] != '\0'){
dynamicArr[i] = string[i];
//would I be able to allocate more memory onto the end of dynamicArr here?
}
显然,在这种情况下我可以只使用 strlen 和 strcpy,但我正在尝试使用各种标记 ' ' '\"' 和 '\'' 解析一行命令。因此各个字符串不是以 null 结尾的。我有使用静态二维数组编写它,但我想使其动态,以便它可以处理任何大小的命令。
在 c 中,对 malloc 的连续调用会在上一次调用之后直接分配空间吗?
不。没有必要。
malloc
分配连续的内存块,但它不能保证下一次调用 malloc
会在前一个调用之后分配该块。
我已经使用静态二维数组编写了它,但我想让它动态化,以便它可以处理任何大小的命令。
使用 realloc() 函数。
不。绝对不是。
由 malloc 分配的内存块不保证其位置或与其他块的关系。它后面可能有空闲空间,但也可能没有。没有办法延长,也没有办法确定是否可以延长。
您可以使用 realloc() 来代替。对 realloc 的调用将像 malloc 一样返回指向内存块的指针,同时保留传入的块的内容,但不一定位于同一位置。根据请求的大小(较小、相同大小或较大)以及堆中空间的可用性,realloc 可能会返回根据需要调整大小的原始块,也可能会返回不同位置的新块。在后一种情况下,realloc 会将旧内容复制到新块中。
要记住的重要一点是 realloc 返回的指针可能不同,因此您必须假设它会不同并进行相应的编码。
但是,realloc 的开销相对较大,不应该逐字符调用。解决问题的典型方法是读入足够大的临时缓冲区,分配正确大小的内存并复制数据。在 C++ 中,您可以使用字符串或字符向量,这样可以避免很多麻烦。
//我可以在此处的dynamicArr末尾分配更多内存吗?
是的。 可以使用realloc()扩展dynamicArr的大小。
并且,需要注意一些(正如 André Puel 和 DevSolar 评论所指出的):
realloc(ptr, size) 调用首先尝试将 ptr 指向的分配大小更改为 size,并返回 ptr。 但是,如果无法充分更改大小,则 malloc() 会创建一个新分配,复制 ptr 指向的尽可能多的旧数据以适合新分配,释放旧分配,并返回指向该分配的指针。分配的内存。
如果 ptr 为 NULL,则 realloc() 与调用 malloc() 获取 size 字节相同。
如果 size 为零且 ptr 不为 NULL,则分配一个新的最小大小的对象并释放原始对象。
扩展使用 calloc(3) 分配的区域时,realloc(3) 不保证额外的内存也被零填充。