为什么这个C程序导致'appcrash'错误?

时间:2014-04-10 18:56:10

标签: c gcc

我正在Windows 8,x64上编译并运行一个c程序(gcc编译器)。当我尝试运行可执行文件时,Windows会给出错误&app 39“。有人可以帮忙吗?这是程序:

#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);
}

2 个答案:

答案 0 :(得分:4)

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

您的格式字符串要求您传递三个浮点值。你只传递一个,最后一个。你传递的其他参数都是指针。

因此,您的程序会调用未定义的行为。这意味着一切都会发生。在这种情况下,你很幸运,遇到了运行时故障。

我不知道你要做什么,但如果你想打印这三个参数,那么你需要使用%p作为指针。

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

最好的建议是在启用警告的情况下进行编译。所有现代编译器都可以为您找到这样的错误。

答案 1 :(得分:1)

我的编译器会报告以下警告,这些警告确实应该是错误。这些警告是您坠机的根源。

[1:59pm][wlynch@watermelon /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);
                  ~~              ^~~