【问题标题】:realloc dynamic array of char array [duplicate]char数组的realloc动态数组[重复]
【发布时间】:2014-06-03 20:58:28
【问题描述】:

我必须在一个数组中存储一些字符数组。但我不知道我将要存储多少。

什么是最好的:用小尺寸(如 1)初始化我的数组,然后重新分配所有内容?我应该如何使用 realloc 或 malloc?

不幸的是,我不能使用向量、stl 容器或字符串。增加向量的大小非常容易,我试图理解 malloc 和 realloc 但我不...

char ** array=(char**)malloc(10*sizeof(char*));
for (int i=0;i<10;i++)
    array[i]="10";
array=(char **)realloc(array,(sizeof(array)+1)*sizeof(char*));
array[10]="12";

我明白基本原理是的。 是这样的吗?

【问题讨论】:

  • 你知道你需要的最大元素数量吗?另外,为什么不能使用 STL 容器?
  • 了解动态数组并在特定情况下使用它们是一个练习。需要的元素数量可以改变:可以是 0,1....1000...所以不知道。
  • 自己尝试一下,然后发布您的尝试...
  • @MatsPetersson,我编辑了我的帖子。是这样吗?好像可以。非常感谢。
  • 这不是一个非常 C++ 风格的解决方案...

标签: c++ arrays malloc realloc


【解决方案1】:

好吧,看来你不能使用向量,但通常这正是它们的目的。

您的解决方案的问题是它比 C++ 更多,您使用 char 数组,而在 C++ 中您应该使用 string,并且您使用 mallocrealloc,而在 C++ 中您应该使用 new .

此外,您需要为您拥有的每个间接级别分配内存,因此对于char **,您至少需要两次调用malloc。这是一个更正的解决方案(它仍然几乎是 C,而不是真正的 C++,请注意您不使用单个 C++ 标头):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) {

    //allocate a buffer of 10 pointers
    size_t array_size = 10;
    char ** array=(char **)malloc(array_size * sizeof(*array) );
    if (!array)
        return -1;

    //now allocate the 10 pointers with a buffer to hold 42 characters
    for (int i = 0; i < array_size; i++) {
        array[i]= (char *)malloc( 42 * sizeof (*array[i]) );
        if (!array[i])
            return -1;
        strcpy(array[i], "10");
    }

    //for some reason we need to increase array size by 1
    ++array_size;
    array = (char **)realloc(array, array_size * sizeof(*array) );
    array[array_size-1] = (char *)malloc(42 * sizeof(*array[array_size-1]) );
    if (!array[array_size-1])
        return -1;
    strcpy(array[array_size-1], "12");
}

【讨论】:

  • 谢谢,你的回答很清楚。不幸的是,我不能使用 std::string ...我不知道要添加到数组中的 char 数组的大小。所以最好的选择是创建我自己的字符串类并创建一个字符串数组:string* array?
  • 是的,您可以创建自己的字符串类并在其中使用 realloc。令人惊讶的是你不允许使用向量和字符串,通常情况正好相反,学生被禁止使用 char 数组和 malloc,因为在 C++ 中这样做是一个坏习惯。
  • 在这个作业中,我必须处理浅拷贝和深拷贝。 Stl 容器已经实现了它,那是我不能使用它们。谢谢。
  • 如果我错了,请纠正我,但sizeof(*array[i]) 不会只是 1,因为它是 char
猜你喜欢
  • 2016-11-22
  • 1970-01-01
  • 2017-07-02
  • 1970-01-01
  • 2021-04-07
  • 2020-03-17
  • 2019-01-14
  • 2016-04-07
  • 2022-11-22
相关资源
最近更新 更多