试图弄清楚为什么我的struct指针不准确地存储数据

时间:2018-04-16 05:40:14

标签: c pointers structure

我正在努力提高自己的C技能,所以如果我的问题很长,我会道歉。我很难理解为什么我的结构指针在我的程序中保存了错误的值,我试图调试它但我还是比较新的C并希望你们中的一个能告诉我我在做什么这里错了,我如何改进我的代码以及关注什么。

我正在创建一个程序,用于在此结构上存储用户数据,然后将其打印出来。

typedef struct table {
    char *firstName;
    char *lastName;
    int id;
}USER;

以下此功能存储名字

void firstName(int *counter, int *check, USER *pt) {
    for (int i = *counter; i < *check; i++) {
        pt[i].firstName = calloc (MAX_LENGTH, sizeof(pt));
        printf("Enter First Name: ");
        getchar();
        fgets(pt[i].firstName, MAX_LENGTH, stdin);
    }
}

这只是我的bool函数返回true或false

bool isTrue(char *decision) {
    if(*decision == 'Y') {
        return true;
    }
    else {
        return false;
    }
}

这是我的主要

int main(int argc, char **argv) {
    USER *pt = calloc(1, sizeof(pt));
    int counter = 0, check = 0;
    char decision = '\0';

    while (1) {
        printf("Would you like to enter a user?(Y/N):");
        fgets(&decision, 2, stdin);
        strtok(&decision, "\n");       //remove the newline char
        if (!isTrue(&decision)) {
            break;
        }
        if (counter != 0) {
            pt = realloc(pt, sizeof(pt) * 10); //the 10 is temporary
        }
        check = counter + 1; // make sure loop only runs once.
        firstName(&counter, &check, pt);
        ++counter;  // increment counter;
    }
    printStruct(pt, &counter);

    return 0;
}

当我运行它有时它工作正常并返回所有内容,有时它会跳过一个值。这就是我得到的。它会跳过指针索引1处的值并改为打印垃圾。

Would you like to enter a user?(Y/N):N
First name at array 0 is Ermir
First name at array 1 is P#1First name at array 2 is Kevin
First name at array 3 is Blaus
First name at array 4 is Adam

另外我想知道为什么我在这里重新分配如果我在输入第二个名字时出现realloc错误。

    if (counter != 0) {
        pt = realloc(pt, sizeof(pt) * 10); //realloc(pt, sizeof(pt) * counter + 1) wont work
    }

1 个答案:

答案 0 :(得分:0)

char decision = '\0';
...
fgets(&decision, 2, stdin);

你只分配1个字符,但至少要读2个字符。通过分配足够大小的数组来进行修复。

不相关但在firstName()pt[i].firstName = calloc (MAX_LENGTH, sizeof(pt));中应为pt[i].firstName = calloc (MAX_LENGTH, 1);