C 中的 Realloc 核心转储错误

Realloc core dumped error in C

我正在尝试熟悉 calloc 和 realloc。当代码运行这一行时,我不断收到以下错误:

pb *newPhoneBook = (pb *) realloc(PhoneBook, (10 * sizeof(pb)));

realloc: malloc.c:2842: mremap_chunk: Assertion `((size + offset) & (_rtld_global_ro._dl_pagesize - 1)) == 0' failed.
Aborted (core dumped)

程序运行良好,直到这一行。我是不是没有正确使用 realloc 函数?

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

typedef struct phonebook {
   char cFirstName[30];
   char cLastName[30];
   char cNumber[30];
} pb;

int entry();
void convert_u(char *);

int main()
{
   int iResponse = 0;

   do {
      printf("\nPhonebook Menu\n****************\n\n");
      printf("1. Enter new contact\n2. Modify existing contact\n3. Exit\n\n");
      printf("Please make selection: ");
      scanf("%d", &iResponse);

      if (iResponse == 1) {
         entry();
      }
      else if (iResponse == 2) {
         //modify();
         printf("\nWorking on it...\n");
      }
   } while (iResponse != 3);

   return 0;
}

int entry()
{
   int x;
   char yes_no[] = "YES";
   pb Book = {'[=11=]', '[=11=]', '[=11=]'};
   pb *PhoneBook = (pb *) calloc(5, sizeof(pb));
   PhoneBook = &Book;

   if (PhoneBook == NULL) {
      printf("\nMemory allocation failed.\n\n");
      return 1;
   }

   for (x = 0; x < 10; x++) {
      if (x > 0) {
         printf("\nAnother entry(yes/no)? ");
         scanf("%s", yes_no);
         convert_u(yes_no);
      }

      if (strcmp(yes_no, "YES") == 0 && x > 0) {
         pb *newPhoneBook = (pb *) realloc(PhoneBook, (10 * sizeof(pb))); //fails here
         if (newPhoneBook == NULL) {
            printf("\nOut of memory!\n\n");
            return 1;
         }
         else {
            PhoneBook = newPhoneBook;
         }
      }
      else if (strcmp(yes_no, "NO") == 0) {
         break;
      }

      printf("\nFirst Name: ");
      scanf("%s", PhoneBook[x].cFirstName);

      printf("\nLast Name: ");
      scanf("%s", PhoneBook[x].cLastName);

      printf("\nPhone Number: ");
      scanf("%s", PhoneBook[x].cNumber);

   }
}

void convert_u(char *yes_no)
{
   int x;

   for (x = 0; x < strlen(yes_no); x++) {
      yes_no[x] = toupper(yes_no[x]);
   }
}

不,您没有正确使用 realloc。关于您的代码:

pb Book = {'[=10=]', '[=10=]', '[=10=]'};
pb *PhoneBook = (pb *) calloc(5, sizeof(pb));
PhoneBook = &Book;

虽然 second 行将 PhoneBook 设置为内存区域中的地址(即可以传递给 realloc 的地址),third 行使其指向竞技场外的项目。

使用该指针调用 realloc 是未定义的行为。

完全不确定第三行的意图。如果要确保将字段初始化为 NUL 字符,calloc 已经做到了。

问题出在这里:

pb *PhoneBook = (pb *) calloc(5, sizeof(pb));
PhoneBook = &Book;

您为 5 个 pb 结构分配了 space,但随后您丢弃了该指针,而是将 PhoneBook 设置为指向堆栈上的 Book。所以你甚至没有在那个时候使用 calloc 的结果,你不能从堆栈中 realloc 东西。

您可以改为这样做:

pb *PhoneBook = (pb *) calloc(5, sizeof(pb));
PhoneBook[0] = Book;

这会将 Book 的结构复制到 PhoneBook 的第一个元素中。但是如果你要检查 calloc 是否失败,你应该在结构复制之前这样做。