0

为什么下面的代码有效?那应该是编译错误(或至少是运行时错误)吗?

#include <stdio.h>

int main(int argc, char** argv){
        float *buf = "happy holiday";        // notice the float
        printf("content of buf = %s\n",buf); //its working
        return 0;
}

我编译它并得到一个警告:

~/Desktop/cTest>gcc -o run run.c
run.c: In function `main':
run.c:4: warning: initialization from incompatible pointer type
4

3 回答 3

3

你应该总是编译-Wall -Werror -Wextra(至少)。然后你得到这个:

cc1: warnings being treated as errors
test.c: In function 'main':
test.c:4: warning: initialization from incompatible pointer type
test.c:5: warning: format '%s' expects type 'char *', but argument 2 has type 'float *'
test.c: At top level:
test.c:3: warning: unused parameter 'argc'
test.c:3: warning: unused parameter 'argv'

它“有效”是因为在实践中,你的平台上的引擎盖下的achar *和 a之间没有区别。float *您的代码实际上与以下内容没有什么不同:

#include <stdio.h>

int main(int argc, char** argv){
        float *buf = (float *)"happy holiday";
        printf("content of buf = %s\n",(char *)buf);
        return 0;
}

这是明确定义的行为,除非 和 的对齐要求float不同char,在这种情况下,它会导致未定义的行为(参见 C99,6.3.2.3 p7)。

于 2012-04-09T21:31:57.667 回答
1

该程序不严格符合要求,编译器需要输出诊断信息并有权拒绝编译。所以不要这样做。

于 2012-04-09T21:32:37.617 回答
1

这是 的一种不幸行为gcc,如果有人可以修复它,我们都会处理更少错误的软件。不幸的是,缺乏解决许多此类问题的意愿。提交错误报告不会受到伤害。

于 2012-04-09T21:39:44.727 回答