这个代码我遇到了问题:
int main(int argc, **argv)
{
...
char *dirlog
...
dirlog = malloc(sizeof(getenv("LOG")+strlen("/logfile.log")));
dirlog = strcat(getenv("LOG"),"/logfile.log");
o = strlen(dirlog);
...
free(dirlog);
}
代码编译但运行时,程序返回分段错误。我尝试使用coredump文件进行调试,但backtrace只显示:
#0 0x00007fb7f7e7e3ac in free () from /lib64/libc.so.6
#1 0x0000000000507739 in main (argc=<optimized out>, argv=<optimized out>) at testprogram.c:460
任何线索?
你必须使用strlen
计算两个字符串长度,而不是sizeof
(它只适用于文字,但无论如何都要避免它),但要注意:LOG
env。变量可能会丢失,所以在做之前测试NULL
。
我的建议使用sprintf
,它避免了对strcat
和strcpy
的大量调用,并允许插入像/
这样的固定大小的文字
所以这样做的一种相当安全的方法是:
const char *logroot = getenv("LOG");
if (logroot!=NULL)
{
const char *logfile = "logfile.log";
int len = strlen(logroot)+strlen(logfile)+2; // predict the size of the resulting string
char *dirlog = malloc(len);
sprintf(dirlog,"%s/%s",logroot,logfile);
...
free(dirlog);
}
(我为null-terminator添加了1,为斜杠添加了1,我只在执行sprintf
时才包含)
你的malloc
似乎得到了错误的论点。
getenv
州的手册页,
getenv()函数返回指向环境中值的指针,如果没有匹配则返回NULL。
而strlen("/logfile.log")
将是一个固定的数字。
但是,通过sizeof
添加一些字符指针和一些长度的数字,这是没有意义的。
sizeof
不是你需要的,这就是我可以扣除的东西。
我们可以推断出分段错误。对malloc
的调用必定已经失败,如果没有验证你继续。
你不检查malloc
是否返回任何东西。添加那部分,
char *ptr = getenv("LOG");
size_t sizeRequired = strlen(ptr) + 1 + strlen("logfile.log") + 1;
dirlog = malloc(sizeRequired);
if(dirlog == 0)
{
// Handle the error here and return
}