使用免费发行

时间:2018-03-06 17:09:35

标签: c pointers free

我在这个问题上遇到了问题:

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文件进行调试,但回溯仅显示:

#0  0x00007fb7f7e7e3ac in free () from /lib64/libc.so.6
#1  0x0000000000507739 in main (argc=<optimized out>, argv=<optimized out>) at testprogram.c:460

有任何线索吗?

2 个答案:

答案 0 :(得分:4)

你必须使用strlen来计算两个字符串长度,而不是sizeof(这只适用于文字,但无论如何都要避免),但要注意:LOG env。变量可能会丢失,因此在执行此操作之前请对NULL进行测试。

我的提案使用sprintf,这避免了对strcatstrcpy的大量调用,并允许插入固定大小的文字,例如/

这样做的一种相当安全的方法是:

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);
}

(我为nul-terminator添加了1,为斜杠添加了1,我只在执行sprintf时才包含<)

答案 1 :(得分:3)

你的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
}