我有一些奇怪的错误,当我尝试打印时,struct phoneEntry的lastName和phoneNumber char数组成员被覆盖。 以下代码是与主要部分相关的位和代码片段。
typedef struct
{
char firstName[30];
char lastName[30];
char phoneNumber[30];
} phoneEntry;
size_t phoneBookSize = 1;
phoneEntry* ptrPhoneBook = malloc(phoneBookSize * sizeof(phoneEntry));
FILE *loadedFile;
char fileName[30];
scanf("%s", fileName);
loadedFile = fopen(fileName, "w"); // ERROR OCCURS
fprintf(loadedFile, "First name\tLast name\tPhone Number\n");
int count = 0;
for (count = 0; count < phoneBookSize - 1; count++)
{
printf("saving %s %s %s\n", ptrPhoneBook[count].firstName, ptrPhoneBook[count].lastName, ptrPhoneBook[count].phoneNumber);
fprintf(loadedFile, "%s\t%s\t%s\t\n", ptrPhoneBook[count].firstName, ptrPhoneBook[count].lastName, ptrPhoneBook[count].phoneNumber);
}
fclose(loadedFile);
基本上,存储在struct成员中的每个字符数组中的数据是定义的,并且存在直到“loadedFile”初始化。 此时,存储在索引0处的ptrPhoneBook中的lastname和phoneNumber char数组成员中的数据将被覆盖,或者只是被擦除。
这是输出:
First name Last name Phone Number
James
与预期的产出相反:
First name Last name Phone Number
James Bond 007
我可以通过简单地将ptrPhoneBook的计数设置为1而不是0来避免整个问题,但我想知道为什么fopen会破坏索引0处的这些数据成员。
我给出的代码可能不会给你一个确切的输出,但错误仍然存在。
如果您想尝试自己运行代码,这里的代码可以直接运行。
// Including libraries into the source code
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
char firstName[30];
char lastName[30];
char phoneNumber[30];
} phoneEntry;
main()
{
size_t phoneBookSize = 1;
phoneEntry* ptrPhoneBook = malloc(phoneBookSize * sizeof(phoneEntry));
phoneBookSize++;
phoneEntry* reallocPhoneBook = realloc(ptrPhoneBook, phoneBookSize);
if (reallocPhoneBook) {
ptrPhoneBook = reallocPhoneBook;
} else {
printf("Failure. Memory error.\n\n");
}
strcpy(ptrPhoneBook[0].firstName, "James");
strcpy(ptrPhoneBook[0].lastName, "Kim");
strcpy(ptrPhoneBook[0].phoneNumber, "2343");
FILE *loadedFile;
char fileName[30];
scanf("%s", fileName);
loadedFile = fopen(fileName, "w");
fprintf(loadedFile, "First name\tLast name\tPhone Number\n");
int count = 0;
for (count = 0; count < phoneBookSize - 1; count++)
{
printf("saving %s %s %s\n", ptrPhoneBook[count].firstName, ptrPhoneBook[count].lastName, ptrPhoneBook[count].phoneNumber);
fprintf(loadedFile, "%s\t%s\t%s\t\n", ptrPhoneBook[count].firstName, ptrPhoneBook[count].lastName, ptrPhoneBook[count].phoneNumber);
}
fclose(loadedFile);
}
上面代码的输出是:
First name Last name Phone Number
James 2343
答案 0 :(得分:2)
realloc
完全是假的,因为它分配2个字节而不是2个电话条目:
size_t phoneBookSize = 1;
/* ... */
phoneBookSize++;
phoneEntry* reallocPhoneBook = realloc(ptrPhoneBook, phoneBookSize);
/* ... */
ptrPhoneBook = reallocPhoneBook;
你可能意味着:
realloc(ptrPhoneBook, phoneBookSize * sizeof(phoneEntry))
答案 1 :(得分:0)
+1 - realloc看起来像问题1。
但是,您的for循环也是错误的:您在跳过最后一个条目的count < phoneBookSize - 1
时循环播放 - 将其更改为count < phoneBookSize
,例如如果phoneBookSize是3,你应该去阵列索引[2]