C中的Realloc内核转储错误
我正在努力熟悉calloc和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
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能读到它并学到一些东西。