malloc error:初始值设定元素不是常量

#include <stdio.h>
#include <stdlib.h>

char *buf = (char *)malloc(BUFSIZ); 

setbuf(stdout,buf);
printf("Set STDOUT full buffer OK!
");
setbuf(stdout,NULL);
printf("Set STDOUT no buffer OK!
");

运行出错:

[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
原文地址:https://www.cnblogs.com/zhanbiqiang/p/4223388.html