Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中的Realloc内核转储错误_C_Memory Management_Dynamic Memory Allocation - Fatal编程技术网

C中的Realloc内核转储错误

C中的Realloc内核转储错误,c,memory-management,dynamic-memory-allocation,C,Memory Management,Dynamic Memory Allocation,我正在努力熟悉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 dumpe

我正在努力熟悉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 = {'\0', '\0', '\0'};
   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 = {'\0', '\0', '\0'};
pb *PhoneBook = (pb *) calloc(5, sizeof(pb));
PhoneBook = &Book;
第二行将电话簿设置为内存竞技场中的地址,即可以传递给realloc的地址,第三行将电话簿指向竞技场外的项目

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

我不完全确定你的第三行的意图是什么。如果是为了确保字段初始化为NUL字符,calloc已经这样做了。

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

pb Book = {'\0', '\0', '\0'};
pb *PhoneBook = (pb *) calloc(5, sizeof(pb));
PhoneBook = &Book;
第二行将电话簿设置为内存竞技场中的地址,即可以传递给realloc的地址,第三行将电话簿指向竞技场外的项目

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

我不完全确定你的第三行的意图是什么。如果要确保字段初始化为NUL字符,calloc已经这样做了。

问题在于:

pb *PhoneBook = (pb *) calloc(5, sizeof(pb));
PhoneBook = &Book;
您为5 pb结构分配空间,但随后放弃该指针,而是将PhoneBook设置为指向堆栈上的Book。因此,此时您甚至没有使用calloc的结果,并且无法从堆栈中重新定位某些内容

您可以这样做:

pb *PhoneBook = (pb *) calloc(5, sizeof(pb));
PhoneBook[0] = Book;
这将在PhoneBook的第一个元素中执行Book的结构副本。但是,如果要检查calloc是否失败,则应在复制结构之前进行检查。

问题在于:

pb *PhoneBook = (pb *) calloc(5, sizeof(pb));
PhoneBook = &Book;
您为5 pb结构分配空间,但随后放弃该指针,而是将PhoneBook设置为指向堆栈上的Book。因此,此时您甚至没有使用calloc的结果,并且无法从堆栈中重新定位某些内容

您可以这样做:

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

这将在PhoneBook的第一个元素中执行Book的结构副本。但是,如果要检查calloc是否失败,则应在复制结构之前进行检查。

请注意:一般规则是类型开始,大写字母变量不开始。你这样做会使代码难以阅读。@John3136,这是一个风格指南,与C语言本身完全无关。类型和变量为两个的标识符遵循相同的规则。事实上,我经常做一些事情,比如typedef struct sSomething{…}tSomething;,这是非常可读的:-@paxdiablo是的,你的权利。这是一种时尚。我们都知道有不止一种可行的风格,但OPs风格并不是我们期望作为专业人士看到的风格,这意味着其他人很难阅读和维护他们的代码。我认为这是一个合理的评论,而不是一个答案——希望OP能读到它并学到一些东西。请:一般规则是类型开始,大写字母变量不开始。你这样做会使代码难以阅读。@John3136,这是一个风格指南,与C语言本身完全无关。类型和变量为两个的标识符遵循相同的规则。事实上,我经常做一些事情,比如typedef struct sSomething{…}tSomething;,这是非常可读的:-@paxdiablo是的,你的权利。这是一种时尚。我们都知道有不止一种可行的风格,但OPs风格并不是我们期望作为专业人士看到的风格,这意味着其他人很难阅读和维护他们的代码。我认为这是一个合理的评论,而不是一个答案——希望OP能读到它并学到一些东西。