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
是否失败,你应该在结构复制之前这样做。
我正在尝试熟悉 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
是否失败,你应该在结构复制之前这样做。