1

我说的是使用 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,但我正在尝试使用各种标记解析一行命令,'''\"' 和 '\''。所以各个字符串不是以空值结尾的。我写过它使用静态二维数组,但我想让它动态化,以便它可以处理任何大小的命令。

4

3 回答 3

2

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

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

我已经使用静态 2d 数组编写了它,但我想让它动态化,以便它可以处理任何大小的命令。

使用realloc()函数。

于 2014-04-23T02:50:47.093 回答
1

不,绝对不是。

malloc 分配的内存块不保证其位置或与其他块的关系。紧随其后可能有可用空间,但很可能没有。没有办法扩展它,也没有办法确定它是否可以扩展。

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

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

但是,realloc 相对昂贵,不应该逐个字符地调用。解决问题的典型方法是读入足够大的临时缓冲区,分配正确大小的内存并复制数据。在 C++ 中,您将使用 char 的字符串或向量并为自己省去很多麻烦。

于 2014-04-23T03:01:08.210 回答
1

//我能在这里分配更多的内存到 dynamicArr 的末尾吗?

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

于 2014-04-23T02:51:09.357 回答