【问题标题】:Error at execution because of realloc由于 realloc 导致执行错误
【发布时间】:2015-12-14 09:58:48
【问题描述】:

我写了一个小控制台程序,它将单词存储在一个数组中,由
char** test_tab 表示,然后打印它们。

只要不运行,程序就可以正常工作通过条件realloc()
(例如,如果我将size增加到1000)。
但是如果realloc()被调用,程序在数组打印期间崩溃,可能是因为那里的记忆混乱了。

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

char* get_word();

int main(int argc, char* argv[])
{
    size_t size = 100;
    size_t nb_pointer = 0;
    char** test_tab = malloc(size * sizeof *test_tab);
    char** temp_tab;

    while((*(test_tab + nb_pointer) = get_word()) != NULL)
    {
        nb_pointer++;
        if(nb_pointer >= size)
        {
            size += 100;
            temp_tab = realloc(test_tab, size);

            if(temp_tab != NULL)
                test_tab = temp_tab;
            else
            {
                free(test_tab);
                exit(1);
            }
        }
    }

    for(nb_pointer = 0; *(test_tab + nb_pointer) != NULL; nb_pointer++)
        printf("%s\n", *(test_tab + nb_pointer));

    free(test_tab);

    return 0;
}

有人可以解释一下我在这里做错了什么吗?谢谢。

【问题讨论】:

    标签: c arrays pointers memory-management realloc


    【解决方案1】:

    realloc 中的内存量计算不正确。

           temp_tab = realloc(test_tab, size);
    

    应该是

           temp_tab = realloc(test_tab, size * sizeof *test_tab);
    

    【讨论】:

    • 好的,我明白了。我还修改了我的循环以在测试nb_pointer &gt;= size之前增加nb_pointer,否则可以添加一个字符串而没有分配足够的内存。
    【解决方案2】:

    每次您尝试推送一个字符串并同时带走所有先前推送的字符串时。现在字符串表示char * & 因此您需要使用sizeof(char*) * size & 然后您需要再次将内存分配给字符串以存储实际字符..但是您也可以这样处理

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    static int size = 0;  // static global means no risk while including this file
    
    
    char** push(char** memptr, char* data) {
      size++;
      if (size == 1)
        memptr = (char**)malloc(size * sizeof(char*));
      else
        memptr = (char**)realloc(memptr, size* sizeof(char*));
    
      memptr[size - 1] = (char*)malloc(sizeof(char) * strlen(data) + 1);
      strncpy(memptr[size - 1], data, strlen(data));
      memptr[size - 1][strlen(data) -1] = '\0'; // over writing the `\n` from `fgets`
      return memptr;
    }
    
    
    int main() {
      char buf[1024];
      int i;
      static char** memptr = NULL;
      for (i = 0; i < 5; i++){
        fgets(buf, 1024, stdin);
        memptr = push(memptr, buf);
      }
    
      for (i = 0; i < size; i++)
        printf("%s\n", memptr[i]);
    
      return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-13
      • 1970-01-01
      • 2013-04-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多