c - 重新分配多维数组

标签 c arrays dynamic-memory-allocation

这是我重新分配多维数组时的代码。当我多次使用函数 add_line 时,代码不起作用。一整天都在试图弄清楚。有人可以帮忙吗?

void add_line(char ** wlist, char * word, int * size) // Extending wordlist or cross
{
    (*size)++;
    char ** new_wlist = (char**)realloc(wlist,(*size)*sizeof(char*));
    if(new_wlist == NULL)
        show_error("Reallocation error",1);

    wlist = new_wlist;
    wlist[(*size)-1] = (char*)malloc(ROW_SIZE*sizeof(char));
     if(strlen(word)>ROW_SIZE)
        show_error("Word too long", 1);
    strcpy(wlist[(*size)-1],word);
}
int main()
{
    int * w_size = (int*)malloc(sizeof(int));
    int * c_size = (int*)malloc(sizeof(int));
    *w_size = 0;
     *c_size = 0;
    char ** wordlist = (char**)malloc(sizeof(char*));
    char ** cross = (char **)malloc(sizeof(char*)); 

    add_line(cross,"test1",c_size);
    add_line(cross,"test2",c_size);
    return 0;
}

最佳答案

问题是您没有返回修改后的 wlist - 这是代码的固定(但未经测试)版本:

void add_line(char *** wlist, const char * word, int * size) // Extending wordlist or cross
              //   ^^^ note extra level of indirection here
{
    int new_size = *size + 1;
    char ** new_wlist = realloc(*wlist, new_size*sizeof(char*));
    if (new_wlist == NULL)
        show_error("Reallocation error",1);

    new_wlist[new_size-1] = malloc(ROW_SIZE);
    if (strlen(word)>ROW_SIZE)
        show_error("Word too long", 1);
    strcpy(new_wlist[new_size-1],word);
    *wlist = new_wlist;
    *size = new_size;
}

int main()
{
    int c_size = 0; // NB: no need for dynamic allocation here

    char ** cross = NULL; // NB: initial size is zero - realloc will do the right thing

    add_line(&cross, "test1", &c_size);
          // ^ pass pointer to cross here
    add_line(&cross, "test2", &c_size);
          // ^ pass pointer to cross here

    return 0;
}

我还修复了其他一些小问题 - cross 的初始大小现在为 0(原来是 1),并且我删除了 c_size 不必要的动态分配>。我还删除了不必要的强制转换,这些强制转换在 C 中可能存在潜在危险,并删除了 sizeof(char) 的冗余使用(根据定义等于 1)。

关于c - 重新分配多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18190910/

相关文章:

c - C语言中普通指针和自引用指针有什么区别

c++ - 在 C++ 中删除时间数组

c - 对多个文件使用 gcc

c - 我想为我的学习实现一个小的路由表。我知道它是在路由器中使用基数/帕特里夏树实现的

c - 取消引用双指针

python - 为什么对看似数据副本的操作会修改原始数据?

java - 如何将元素复制到没有大写字符的第二个数组?

c - RubyInline 将 VALUE 数组从一个函数传递到另一个函数

java - 如何找到数组中的下一个可用插槽?

c - 在结构的二维数组中分配内存时出现问题