为什么我可以将一个字符串分配给指向float的指针?

时间:2012-04-09 21:29:40

标签: c pointers typing

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

#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

3 个答案:

答案 0 :(得分: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'

它“有效”,因为在实践中,平台下的char *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;
}

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

这是gcc的一个不幸的行为,如果有人能解决它,我们都会处理更少的错误软件。不幸的是,缺乏解决这类问题的意愿。提交错误报告不会有害。