标签:
#include <stdio.h> #include <stdlib.h> char *buf = (char *)malloc(BUFSIZ); setbuf(stdout,buf); printf("Set STDOUT full buffer OK!\n"); setbuf(stdout,NULL); printf("Set STDOUT no buffer OK!\n");
运行出错:
[zbq@centos6~/test]$ gcc buffer.c buffer.c:18: 错误:初始值设定元素不是常量 buffer.c:20: 警告:数据定义时没有类型或存储类 buffer.c:20: 警告:函数声明中出现形参名却未指定类型 buffer.c:20: 错误:与‘setbuf’类型冲突 /usr/include/stdio.h:331: 附注:‘setbuf’的上一个声明在此 buffer.c:21: 错误:expected declaration specifiers or ‘...’ before string constant buffer.c:21: 警告:数据定义时没有类型或存储类 buffer.c:21: 错误:与‘printf’类型冲突 buffer.c:21: 附注:带有省略号的形参列表无法与空形参名列表声明匹配 buffer.c:22: 错误:expected ‘)’ before ‘(’ token buffer.c:23: 错误:expected declaration specifiers or ‘...’ before string constant buffer.c:23: 警告:数据定义时没有类型或存储类 buffer.c:23: 错误:与‘printf’类型冲突 buffer.c:23: 附注:带有省略号的形参列表无法与空形参名列表声明匹配
后来百度得知原因是:
char *buf = (char *)malloc(BUFSIZ);
全局变量buf 的初始化的值应该为一个常量,而malloc返回值是不定的(分配成功则返回指向被分配内存的指针,此存储区中的初始值不确定,否则返回空指针NULL),编译器在编译时无法断言start的初始值是多少,于是就自作主张的用0的代替了。这应该属于全局变量和局部变量的初始化的差异所在的地方。
只需将char *buf 改成局部变量就可以编译通过了。
http://zhidao.baidu.com/link?url=WS7VNppnzd1N3YKqL4R6e6jZwf6le_cjkeE5YoXh0pWOAd0oAzlYYM_VEQOzpn2loqufsXaECZBZPs9zBICLea
标签:
原文地址:http://www.cnblogs.com/zhanbiqiang/p/4223388.html