2014-04-01 4 views
0

Ниже код работает (без ошибок), но я получаю странный вывод, такие как это из кода ниже:Ниже кода дает странный вывод

ВЫВОД:

зовут 8îk и величина 0

Имя is ░î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); 

} 

ответ

3

first и seconds уже указатели, так что вам не нужно, чтобы передать свой адрес, но их значение (адрес структуры они, указывая на):

display(first); 
display(second); 
+0

спасибо за ответ – Lyrk

1
display(first); 
display(second); 

first и second уже указатели, как требуется display.

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! 
+0

спасибо, я открою предупреждения. – Lyrk

1

Вы передаете адрес указателя на структуру функции «отображение», а не передаете адрес самой структуры. (вы передаете «struct item **»).

дисплей (первый); дисплей (второй); решит проблему.

Смежные вопросы