首页 > 代码库 > malloc error:初始值设定元素不是常量

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

#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 constantbuffer.c:21: 警告:数据定义时没有类型或存储类buffer.c:21: 错误:与‘printf’类型冲突buffer.c:21: 附注:带有省略号的形参列表无法与空形参名列表声明匹配buffer.c:22: 错误:expected ‘)’ before ‘(’ tokenbuffer.c:23: 错误:expected declaration specifiers or ‘...’ before string constantbuffer.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

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