从C中的结构成员char数组打印char数组时fopen数据损坏

时间:2011-10-26 19:38:53

标签: c arrays file char fopen

我有一些奇怪的错误,当我尝试打印时,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    

2 个答案:

答案 0 :(得分:2)

realloc完全是假的,因为它分配2个字节而不是2个电话条目

size_t phoneBookSize = 1;
/* ... */
phoneBookSize++;
phoneEntry* reallocPhoneBook = realloc(ptrPhoneBook, phoneBookSize);

/* ... */
ptrPhoneBook = reallocPhoneBook;

你可能意味着:

realloc(ptrPhoneBook, phoneBookSize * sizeof(phoneEntry))

答案 1 :(得分:0)

对于cnicutar的答案,

+1 - realloc看起来像问题1。

但是,您的for循环也是错误的:您在跳过最后一个条目的count < phoneBookSize - 1时循环播放 - 将其更改为count < phoneBookSize,例如如果phoneBookSize是3,你应该去阵列索引[2]