我正在尝试使用printf在一个名为point_person的指针内打印出一个字符数组,当我用它来返回用户的第一个名字时,它会输出很多垃圾,最后是名字。
代码看起来像这样:
person dequeue_person;
person *point_person = &dequeue_person;
get_person(point_person, 9);
printf("%s", point_person->first_name);
person是一个包含3个char变量的typedef结构:first_name [64],last_name [64],pes_nbr [64]。
输出如下:
F÷rnamn:约翰 ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠John
是什么导致这种情况,以及如何在将来避免这种情况?
编辑: 填充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。
答案 0 :(得分: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);
}
答案 1 :(得分:0)
person dequeue_person;
和person per_son;
是两个不同的对象。
你把名字放在一个但打印另一个,所以它仍然是垃圾。
当您创建person
对象时,所有成员都未初始化,因此它是垃圾值。
当你尝试打印它时,它会在堆栈上打印垃圾值。你得到这个。
编辑:正在编辑问题
get_person(point_person, 9);
调用get_person()
后,它将执行get_person()
函数的代码。
因此,存在本地per_son
对象,因此您放置的任何名称实际上都是本地名称,并且在退出get_person()
后将自动销毁。
在那里打印first_name本身是个好主意,但是在调用环境中你还在做printf()
还有一个错误,它会给你本地对象的first_name(即垃圾)。
如果您想传递person
中的get_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()
的指针指向在调用enviroment时创建的同一个对象。查看get_person()
的实现
我希望你现在能得到它。
答案 2 :(得分:0)
结构的内容未初始化。你需要将它们设置为某种东西。
您可以像这样初始化您的结构:
struct person dequeue_person = { "joe", "blogs", "42" };
或者您可以创建一个空结构
struct person dequeue_person = { "", "", "" };
清除整个结构并不罕见:
struct person dequeue_person;
memset( &person, 0, sizeof(struct person) );
编辑....我注意到在垃圾输出的最后,出现了“John”这个词。可能是你的队列结束了吗? 即元素QUEUE_MAX_SIZE-1
。也许您没有正确初始化index
和head
,或者您在错误的时间更改了它们的值。
或者可能index+head
不是解决队列的正确方法。通常你会有head
和tail
索引,你不会以这种方式添加它们。你在做什么意味着index
实际上是队列中元素的数量。