2016-10-23 4 views
-5

내 프로그램에 몇 가지 경고가 있으며 충돌이 발생합니다. 충돌이 경고와 관련이있는 것 같지만 이해가되지 않습니다. 여기 내 코드입니다 :세그먼트 오류 및 인쇄 오류

#include <stdio.h> 

struct student { 
    char name[100]; 
    int id; 
    char *department; 
    struct result { 
     float gpa; 
     char grade; 
    } res; 
}; 

int main(void) { 
    struct student W[] = {{"Saud Farooqui",137,"Electronics",{3.05,'A'}}, 
      {"Talha Farooqui",129,"Civil",{3.5,'A'}}}; 

    printf("First student data is\n%s\t%d\t%s\t%f\t%c",W[0].name,W[0].id, 
     W[0].department,W[1].res.gpa,W[0].res.grade); 

    printf("\nSecond student data is\n%s\t%d\t%s\t%f\t%c",W[1].name,W[1].id, 
     W[1].res.gpa,W[1].res.grade); 
} 

두 번째 printf의 형식 지정자에 대한 이러한 경고를 인쇄 컴파일러 : 나는이 프로그램을 실행했을 때

foo.c:24:10: warning: format '%s' expects argument of type 'char *', but argument 4 has type 'double' [-Wformat=] 
      W[1].res.gpa,W[1].res.grade); 
     ^
foo.c:24:10: warning: format '%f' expects argument of type 'double', but argument 5 has type 'int' [-Wformat=] 
foo.c:24:10: warning: format '%c' expects a matching 'int' argument [-Wformat=] 

, 첫 printf이 선을 인쇄하지만, 두 번째 실패 :

Segmentation fault (core dumped) 

무엇이 잘못 되었나요? 경고 및 충돌을 수정하려면 어떻게합니까?

+4

경고 메시지에서 명확하지 않은 내용은 무엇입니까? segfault가 어쨌든 경고를 무시하는 것과 관련이 있다고 생각하지 않습니까? 경고는 유용합니다. 당신은 그것을 잘못된 길로 돌리고 있습니다. 먼저 경고를 수정하면 코드가 실행됩니다. –

+0

나는 약간의 정보를 재 배열하려고 노력했는데, 이제 나는 그 질문이 더 읽기 쉽고 합리적으로 좋은 질문이라고 생각한다. –

답변

1

department에 대한 인수가 누락되었습니다.

a.c:21:7: warning: format ‘%s’ expects argument of type ‘char *’, but argument 4 has type ‘double’ [-Wformat=] 
     W[1].name, W[1].id, W[1].res.gpa, W[1].res.grade); 
    ^
a.c:21:7: warning: format ‘%f’ expects argument of type ‘double’, but argument 5 has type ‘int’ [-Wformat=] 
a.c:21:7: warning: format ‘%c’ expects a matching ‘int’ argument [-Wformat=] 

은 또한, 아마 예상되는 첫 번째 printf 인쇄 W[1].res W[0].res가 될 : 경고 ( -Wall) 켜져 당신이 에게 그것을 컴파일 할 때 그것은 분명하다.

고정 버전 :

struct student W[] = {{"Saud Farooqui",137,"Electronics",{3.05,'A'}}, 
    {"Talha Farooqui",129,"Civil",{3.5,'A'}}}; 

printf("First student data is\n%s\t%d\t%s\t%f\t%c", 
    W[0].name, W[0].id, W[0].department, W[0].res.gpa, W[0].res.grade); 

printf("\nSecond student data is\n%s\t%d\t%s\t%f\t%c", 
    W[1].name, W[1].id, W[1].department, W[1].res.gpa, W[1].res.grade); 

그래서 세그멘테이션 결함으로 인해합니다 (%s 형식 지정자에 대응하는) 스트링에 대한 포인터 W[1].res.gpa 해석하려는 시도, 즉 const char *이다.

+0

그게'W [1] .department'가 아니겠습니까? – msw

+0

세그먼트 화 위반을 일으키지는 않지만 첫 번째 printf의 W [1] .res는 W [0] .res'가 아니어야합니다. 그리고 모든 것이 루프 대신에 좋을까요? – msw

+0

OP가'W [1] .res'을 의미하지 않는다고 확신합니까? – msw