繁体   English   中英

试图找出为什么我的结构指针存储不正确的数据

[英]Trying to figure out why my struct pointer is storing data inaccurately

我正在努力提高自己的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);
    }
}

这只是我的布尔函数返回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

我也想知道为什么当我在这里重新分配时,如果输入第二个名字,我得到一个重新分配错误。

    if (counter != 0) {
        pt = realloc(pt, sizeof(pt) * 10); //realloc(pt, sizeof(pt) * counter + 1) wont work
    }
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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM