下面的代码工作(没有错误),但我从下面的代码得到奇怪的输出:
输出:
名称为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);
}
答案 0 :(得分:3)
first
和seconds
已经是指针,所以你不需要传递它们的地址,而是它们的值(它们所指向的结构的地址):
display(first);
display(second);
答案 1 :(得分:1)
display(first);
display(second);
根据{{1}}结构的要求, first
和second
已经是指针。
答案 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 **”)。
显示(第一); 显示(第二);将解决问题。