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

为什么这个C程序会导致';appcrash';错误?,c,gcc,C,Gcc,我正在Windows8x64上编译并运行一个c程序(gcc编译器)。当我尝试运行可执行文件时,windows给出错误“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,&am

我正在Windows8x64上编译并运行一个c程序(gcc编译器)。当我尝试运行可执行文件时,windows给出错误“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);
}
#包括
#包括
int main(int args,char*argv[])
{
浮点数a=5;
浮动*p1;
浮点*p2,p3;
p1=&a;
printf(“%f\n%f\n%f\n”,p1和p1,*p1);
}
格式字符串要求传递三个浮点值。你只通过一个,最后一个。您传递的其他参数都是指针

printf("%p\n%p\n%f\n", p1, &p1, *p1);
因此,您的程序调用未定义的行为。这意味着任何事情都可能发生。在这种情况下,您很幸运,遇到了运行时故障

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

printf("%p\n%p\n%f\n", p1, &p1, *p1);
最好的建议是编译时启用警告。所有现代编译器都可以为您找到此类错误

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

printf("%p\n%p\n%f\n", p1, &p1, *p1);
因此,您的程序调用未定义的行为。这意味着任何事情都可能发生。在这种情况下,您很幸运,遇到了运行时故障

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

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

最好的建议是编译时启用警告。所有现代编译器都可以为您找到此类错误。

我的编译器报告了以下警告,这些应该是错误。这些警告是导致崩溃的原因

[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);
                  ~~              ^~~

我的编译器报告了以下警告,这些警告实际上应该是错误。这些警告是导致崩溃的原因

[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);
                  ~~              ^~~


您希望它打印什么?您应该在printfpointers中使用%p、%p、%f。指针不是浮点数…在gnu gcc 4.8上编译并执行良好。1@mangusta它可能是,但它肯定不是必需的。它也将与ABI等有关。。。printf是可变的,因此对于x86_64,所有参数都被推送到堆栈上,这就是它可以工作的原因。。。但是C语言不需要它。您希望它打印什么?您应该在printfpointers中使用%p、%p、%f不是浮点数…在gnu gcc 4.8上编译并执行良好。1@mangusta它可能是,但它肯定不是必需的。它也将与ABI等有关。。。printf是可变的,因此对于x86_64,所有参数都被推送到堆栈上,这就是它可以工作的原因。。。但C语言并不要求它这样做。虽然我完全同意这一点,但我不明白为什么它会崩溃,而不仅仅是打印垃圾。@Maxime:因为它是未定义的行为。编译器不需要为这段代码实现一个合理的处理路径。当它应该保持安静时,编译器会发出警告,就像以前的编译器一样。这是一个带有va列表的库函数调用,原则上无法检查。此外,格式信息只能在运行时进行评估。虽然我完全同意这一点,但我不明白为什么它会崩溃,而不仅仅是打印垃圾。@Maxime:因为它是未定义的行为。编译器不需要为这段代码实现一个合理的处理路径。当它应该保持安静时,编译器会发出警告,就像以前的编译器一样。这是一个带有va列表的库函数调用,原则上无法检查。此外,格式信息只能在运行时进行评估。我同意你的回答。然而,我的windows gcc编译器没有给出一个警告。你让它给出警告了吗?根据我的经验,它也给出了类似语法的警告。我遗漏了什么吗?你需要请求警告。我同意你的答案。然而,我的windows gcc编译器没有给出一个警告。你让它给出警告了吗?根据我的经验,它也给出了类似语法的警告。我遗漏了什么吗?你需要请求警告。使用-墙壁