下面代码给出了奇怪的输出

时间:2014-04-01 13:29:31

标签: c struct

下面的代码工作(没有错误),但我从下面的代码得到奇怪的输出:

输出:

名称为8îk,数量为0

名称为░îk,数量为2130567168

我的错误在哪里?

#include <stdio.h>
#include <stdlib.h>

void display(struct item *);

struct item{

char name[50];
int quantity;

};

int main(void){

struct item *first = (struct item *)malloc(sizeof(struct item));
strcpy(first->name, "Banana");
first->quantity = 32;

struct item *second = (struct item *)malloc(sizeof(struct item));
strcpy(second->name, "Apple");
second->quantity = 432;

display(&first);
display(&second);

getch();

}

 void display(struct item *i){

printf("Name is %10s and quantity is %7d\n", i->name, i->quantity);

}

4 个答案:

答案 0 :(得分:3)

firstseconds已经是指针,所以你不需要传递它们的地址,而是它们的值(它们所指向的结构的地址):

display(first);
display(second);

答案 1 :(得分:1)

display(first);
display(second);
根据{{​​1}}结构的要求,

firstsecond已经是指针。

答案 2 :(得分:1)

除了调用display()时出现的明显错误,您还缺少#include <string.h>。如果你有compiled with warnings enabled,你会收到警报,以及调用display()的问题以及其他一些问题:

Line 4: warning: 'struct item' declared inside parameter list
Line 4: warning: its scope is only this definition or declaration, which is probably not what you want
In function 'main':
Line 16: warning: incompatible implicit declaration of built-in function 'strcpy'
Line 23: warning: passing argument 1 of 'display' from incompatible pointer type
Line 24: warning: passing argument 1 of 'display' from incompatible pointer type
t.c: At top level:
Line 30: error: conflicting types for 'display'
Line 4: error: previous declaration of 'display' was here

故事的寓意:始终在启用警告的情况下编译,并注意任何警告!

还有一点要注意:你应该never cast the result of malloc in C,例如

struct item *first = malloc(sizeof(struct item)); // do not apply redundant and
                                                  // potentially dangerous cast!

答案 3 :(得分:1)

您将指向结构的指针的地址传递给函数“display”,而不是传递结构本身的地址。 (你传递“struct item **”)。

显示(第一); 显示(第二);将解决问题。