2014-04-10 2 views
0

Windows 8, x64에서 c 프로그램 (gcc 컴파일러)을 컴파일하고 실행하고 있습니다. 실행 파일을 실행하려고하면 'appcrash'오류가 발생합니다. 누구든지 도와 줄 수 있습니까? 세 개의 부동 소수점 값을 전달이 C 프로그램이 'appcrash'오류를 일으키는 이유는 무엇입니까?

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

int main(int args, char* argv[]) 
{ 

float a=5; 
float *p1; 
float* p2, p3; 
p1=&a; 
printf("%f \n %f \n %f \n",p1,&p1,*p1); 
} 
+0

무엇을 인쇄해야합니까? – milleniumbug

+1

printf에서 % p, % p, % f를 사용해야합니다. – user43968

+0

포인터가 부동 상태가 아닙니다 ... –

답변

4
printf("%f \n %f \n %f \n",p1,&p1,*p1); 

당신의 포맷 스트링 요구 : 여기에 프로그램입니다. 당신은 오직 하나만 남기고, 마지막 것을 지나쳐 버리십시오. 전달한 다른 인수는 두 포인터입니다.

따라서 프로그램에서 정의되지 않은 동작을 호출합니다. 그것은 어떤 일이 일어날 수 있음을 의미합니다. 이 경우 운이 좋았고 런타임 오류가 발생했습니다.

나는 당신이 무엇을 하려는지는 모르지만,이 세 가지 주장을 인쇄하려면 포인터에 %p을 사용해야합니다.

printf("%p\n%p\n%f\n", p1, &p1, *p1); 

경고를 사용하여 컴파일하는 것이 가장 좋습니다. 모든 현대 컴파일러는 이러한 실수를 발견 할 수 있습니다.

+0

답변에 동의합니다. 그러나 Windows에서 내 gcc 컴파일러는 단일 경고를주지 않았다. – user3519733

+0

경고를주기 위해 요청 했습니까 –

+0

정상적인 명령 gcc -o prog prog.c를 사용했습니다. – user3519733

1

내 컴파일러는 다음 경고를보고합니다. 실제로는 오류가 발생합니다. 이러한 경고는 충돌의 원인입니다.

[1:59pm][[email protected] /tmp] clang -Wall foo.c 
foo.c:11:32: warning: format specifies type 'double' but the argument has type 'float *' [-Wformat] 
    printf("%f \n %f \n %f \n",p1,&p1,*p1); 
      ~~     ^~ 
foo.c:11:35: warning: format specifies type 'double' but the argument has type 'float **' [-Wformat] 
    printf("%f \n %f \n %f \n",p1,&p1,*p1); 
        ~~    ^~~ 
+0

이 문제를 해결해야한다는 데 절대적으로 동의하지만, 왜 충돌이 발생했으며 단순히 쓰레기를 인쇄하지 않는지 이해할 수 없습니다. –

+0

@Maxime : 정의되지 않은 동작입니다. 컴파일러는이 코드 조각에 대한 제정신 처리 경로를 구현할 필요가 없습니다. –

+0

컴파일러는 오래된 컴파일러처럼 조용하게 유지해야 할 때 경고 메시지를 표시합니다. 이것은 기본적으로 확인할 수없는 VA 목록이있는 라이브러리 함수 호출입니다. 그것에 덧붙여 형식 정보가 런타임에만 매우 잘 평가 될 수 있다고 덧붙여 라. –

관련 문제