繁体   English   中英

由于重新分配,执行时出错

[英]Error at execution because of realloc

我写了一个小的控制台程序,将单词存储在一个数组中,由
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;
}

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

重新分配中的内存量计算不正确。

       temp_tab = realloc(test_tab, size);

应该

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

每次您尝试推入一个琴弦,并同时带走所有先前推入的琴弦时。 现在,字符串表示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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM