1

我正在尝试使用 printf 打印出一个名为 point_person 的指针内的字符数组,当我使用它返回用户的名字时,它会打印出很多垃圾,然后最后打印出名称。

代码看起来像这样:

    person dequeue_person;
    person *point_person = &dequeue_person;
    get_person(point_person, 9);
    printf("%s", point_person->first_name);

person 是一个 typedef 结构,包含 3 个字符变量:first_name[64]、last_name[64]、pes_nbr[64]。

输出如下所示:

f÷rnamn:约翰╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠约翰

是什么原因造成的,我以后如何避免这种情况?

编辑:填充 first_name 的代码如下所示:

void get_person(person *pers, int index)
{
    person per_son;

    strcpy(per_son.first_name, queue[(index+head)%QUEUE_MAX_SIZE].first_name);
    strcpy(per_son.last_name, queue[(index+head)%QUEUE_MAX_SIZE].last_name);
    strcpy(per_son.pers_nbr, queue[(index+head)%QUEUE_MAX_SIZE].pers_nbr);

    pers = &per_son;
    printf("Förnamn: %s\n", per_son.first_name);
}

编辑2:我自己想出来的。我不得不编辑 get_person 函数并删除 per_son 结构并将 strcpy 更改为 pers 而不是 pers_son。

4

3 回答 3

1

您应该使用通过的人 - 而不是本地人:

void get_person(person *pers, int index)
{
    // NOT NEEDED: person per_son;

    strcpy(pers->first_name, queue[(index+head)%QUEUE_MAX_SIZE].first_name);
    strcpy(pers->last_name, queue[(index+head)%QUEUE_MAX_SIZE].last_name);
    strcpy(pers->pers_nbr, queue[(index+head)%QUEUE_MAX_SIZE].pers_nbr);

    // WRONG: pers = &per_son;
    printf("Förnamn: %s\n", pers->first_name);
}
于 2012-11-11T23:55:17.933 回答
0

person dequeue_person;person per_son;是两个不同的对象。您将名称放在一个但打印另一个,所以它仍然是垃圾。

当您创建所有成员的对象时,person所有成员都未初始化,因此它是垃圾值。当你尝试打印它时,它会在堆栈上打印垃圾值。因此你得到了这个。

编辑:问题已编辑

get_person(point_person, 9);

调用后get_person()它将执行get_person()函数的代码。因此,存在本地per_son对象,因此您放置的任何名称实际上都是本地名称,并且在退出打印 first_name 后它将自动销毁,get_person() 这本身是个好主意,但仍然存在一个错误,您printf()在调用环境中也在做这将为您提供本地对象的名字(即垃圾)。

如果你想通过personinget_person()并且想在两个地方打印相同的名字,试试这个:

    person dequeue_person;
    person *point_person = &dequeue_person;
    get_person(point_person, 9);
    printf("%s", point_person->first_name);

void get_person(person *pers, int index)
{
    strcpy(pers->first_name, queue[(index+head)%QUEUE_MAX_SIZE].first_name);
    strcpy(pers->.last_name, queue[(index+head)%QUEUE_MAX_SIZE].last_name);
    strcpy(pers->pers_nbr, queue[(index+head)%QUEUE_MAX_SIZE].pers_nbr);

    printf("In get person First name : %s\n", pers->first_name);
}

在这种情况下,传递给 的指针get_person()指向在调用环境时创建的同一个对象。请参阅get_person()

我希望你现在明白了。

于 2012-11-11T22:23:44.370 回答
0

结构的内容未初始化。您需要将它们设置为某些东西。

你可以像这样初始化你的结构:

struct person dequeue_person = { "joe", "blogs", "42" };

或者您可以创建一个空结构

struct person dequeue_person = { "", "", "" };

清除整个结构并不少见:

struct person dequeue_person;
memset( &person, 0, sizeof(struct person) );

编辑......我注意到在你的垃圾输出的最后,出现了“约翰”这个词。难道这是你队列的尽头? 元素QUEUE_MAX_SIZE-1。也许您没有正确初始化indexhead或者您在错误的时间更改了它们的值。

或者这可能index+head不是解决您的队列的正确方法。通常你会有一个head和一个tail索引,你不会以这种方式添加它们。您所做的意味着index实际上是队列中的元素数。

于 2012-11-11T22:23:59.950 回答