关于C语言之字符串拼接(堆与栈)

2016-12-10 10:42:34来源:作者:PHPor 的Blog人点击

且看一个demo:

int do_sth(int type) {    char *errstr;        switch(type) {    case 1:        errstr = "Error";break    case 2:        errstr = "Warn";break    case 3:        errstr = "Info";break    case 4:        errstr = "Debug";break    default:        return 0;    }     if (...) {..}    if (...) {        ..;        fprintf(stdout, "%s %s", errstr, ...);        return 1;    }    if (...) { return 1;}    if (...) {        fprintf(stderr, "%s %s", errstr, ...);    }    ...    return 0;}

问题: 如何在errstr信息前面添加一个HOSTNAME 环境变量信息?

考虑到errstr有可能写到标准错误,也有可能写到标准输出,也有可能根本就不输出,所以,提前输出HOSTNAME 信息显然不合适 考虑到引用errstr的地方确实不少,最好一开始就拼接HOSTNAME到该errstr 上面去,那么如何拼接呢?

如果是在脚本语言或者带有gc的语言中,完全可以直接在errstr变量前面拼接那个动态获取到的环境变量,如:

errstr=getenv("HOSTNAME") + errstr ;

但是c中却不能这样,为什么呢?字符串拼接的函数不是有的吗,如:strcat;

事实却并非如此简单,为什么呢?

上面的errstr变量是存储在栈上的,不需要考虑free的问题,原作者考虑到后续一大堆复杂的if分支,如果把errstr放在堆上,处处要考虑是不是该把errstr free掉,得死多少脑细胞啊!

对于HOSTNAME是个运行时的信息,显然没法放到栈上,如果非要和errstr拼接起来的话,errstr必须在堆上,即要动态的malloc,由此可见,对于脚本语言来讲,一个非常简单的逻辑,在C中却如此的麻烦

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台