gpt4 book ai didi

c - 内存分配和内存泄漏: C

转载 作者:行者123 更新时间:2023-11-30 15:11:56 25 4
gpt4 key购买 nike

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

返回的 kstring 的 .length 成员应该是 cstr 的长度,加上 1 作为空终止符。 .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;
}

关于c - 内存分配和内存泄漏: C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35329144/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com