繁体   English   中英

内存分配和内存泄漏:C

[英]Memory allocating and memory leaks: C

我对C相当陌生。我有一个名为kstrfrom的函数,该函数需要创建并返回一个新的kstring对象,该对象包含以null终止的C字符串(包括null终止符)的内容的副本。

返回的kstring的.length成员应为cstr的长度,再加上一个代表空终止符。 .data成员应该是指向新分配的内存的指针,您已将cstr的内容(包括末尾的空字节)复制到其中。

如果分配内存时出错,则此函数应调用abort()或引发未捕获的异常。

    kstring kstrfrom(const char *cstr)
    {
        int length=1;    
        while(*cstr!='\0')
        {
            cstr+=1;
            length+=1;
        }
        int i = 0;
        kstring cdest={NULL,0};
        cdest.data = malloc(length+1);
        if(cdest.data == '\0')
        {
            abort();
        }
        else{
            while(cstr[i] != '\0')
            {
                cdest.data[i] = cstr[i];
                i++;
            }
       }
       cdest.data[i] = '\0';
       cdest.data[++i] = '\0';

       return cdest;
  }

我已经运行了一些测试用例:

  Test   9/ 26: kstrfrom gives correct length                      skipped (0)
  Test  10/ 26: kstrfrom contains null byte                        succeeded (1)
  Test  11/ 26: kstrfrom contains correct data                     skipped (0)
  Test  12/ 26: kstrfrom copies, not shares, data                  skipped (0)

如您所见,我需要有关给出正确链接,包含正确数据和复制数据的帮助。

在......的最后

    while(*cstr!='\0')
    {
        cstr+=1;
        length+=1;
    }

您丢失了cstr的初始值

尝试

    int length=1;    
    char * tmp = cstr;
    while(*tmp!='\0')
    {
        tmp+=1;
        length+=1;
    }

您未设置长度成员...

cdest.length = length + 1;

返回kstring有问题。

kstring res;
res = kstrfrom( "My String" ); /* works */
kstrfrom( "Another string" );  /* leaks memory */

其他评论描述了您如何忽略语言功能。 使用...可以更轻松地实现您的代码。

kstring kstrfrom(const char *cstr)
{
    kstring cdest={NULL,0};
    cdest.data = strdup( cstr );
    if( cdest.data == NULL ){
         abort();
    }
    cdest.length = strlen( cstr ) + 1;  /* not done in original example */
    return cdest;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM