C 对字符数组使用printf返回垃圾和字符串

C 对字符数组使用printf返回垃圾和字符串,c,struct,printf,typedef,C,Struct,Printf,Typedef,我试图使用printf打印出指针point_person中的一个字符数组,当我使用它返回用户的名字时,它会打印出很多垃圾,最后是名字 代码看起来有点像这样: person dequeue_person; person *point_person = &dequeue_person; get_person(point_person, 9); printf("%s", point_person->first_name); void get_person

我试图使用printf打印出指针point_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)
{
    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);
}
struct person dequeue_person = { "joe", "blogs", "42" };
person是一个typedef结构,包含3个字符变量:first_name[64]、last_name[64]、pes_nbr[64]

输出如下所示:

    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)
{
    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);
}
struct person dequeue_person = { "joe", "blogs", "42" };
约翰:约翰 ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠约翰

这是什么原因造成的?我今后如何避免

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

    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)
{
    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);
}
struct person dequeue_person = { "joe", "blogs", "42" };
编辑2:
我自己想出来的。我必须编辑get_person函数,删除peru-son结构,并将strcpy改为pers而不是pers-son
每人是两个不同的对象。
你把名字放在其中一个,但打印另一个,所以它仍然是垃圾

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

编辑:当问题被编辑时

get_person(point_person, 9);
调用
get_person()
后,它将执行
get_person()
函数的代码。 因此,这里有一个本地的
peru_son
对象,所以无论您输入什么名称,实际上都是本地名称,在退出
get_person()
在那里打印第一个\u名称本身是个好主意,但在调用环境中执行
printf()
时仍然存在一个错误,这将为您提供本地对象的第一个\u名称(即垃圾)

如果要在
get_person()
中传递
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\u person()
的指针指向在调用环境中创建的同一对象。请参阅
get\u person()


我希望你现在就拿到了。

person-dequeue\u-person
每人是两个不同的对象。
你把名字放在其中一个,但打印另一个,所以它仍然是垃圾

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

编辑:当问题被编辑时

get_person(point_person, 9);
调用
get_person()
后,它将执行
get_person()
函数的代码。 因此,这里有一个本地的
peru_son
对象,所以无论您输入什么名称,实际上都是本地名称,在退出
get_person()
在那里打印第一个\u名称本身是个好主意,但在调用环境中执行
printf()
时仍然存在一个错误,这将为您提供本地对象的第一个\u名称(即垃圾)

如果要在
get_person()
中传递
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\u person()
的指针指向在调用环境中创建的同一对象。请参阅
get\u 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)
{
    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);
}
struct person dequeue_person = { "joe", "blogs", "42" };
也可以创建一个空结构

struct person dequeue_person = { "", "", "" };
清除整个结构并不少见:

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

编辑。。。。我注意到在垃圾输出的最后,出现了“John”一词。这可能是你排队的终点吗?ie元素
队列\u最大\u大小-1
。可能您没有正确初始化
索引
标题
,或者您在错误的时间更改了它们的值


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

结构的内容未初始化。你需要让他们做点什么

您可以按如下方式初始化结构:

    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)
{
    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);
}
struct person dequeue_person = { "joe", "blogs", "42" };
也可以创建一个空结构

struct person dequeue_person = { "", "", "" };
清除整个结构并不少见:

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

编辑。。。。我注意到在垃圾输出的最后,出现了“John”一词。这可能是你排队的终点吗?ie元素
队列\u最大\u大小-1
。可能您没有正确初始化
索引
标题
,或者您在错误的时间更改了它们的值


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

您应该使用passed person,而不是local person:

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);
}

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

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);
}

在发布的代码中,从不填充名字。你能发布填充它的代码吗?╠ 代码页中是否为0xCC