gpt4 book ai didi

c - 释放子串而不在c中做双重释放

转载 作者:太空宇宙 更新时间:2023-11-04 04:08:10 25 4
gpt4 key购买 nike

昨天我问了一个类似的question关于如何释放子字符串分配的内存。现在我还有一个关于相同问题(涉及一组条件)的问题,如何在不执行双重释放的情况下释放以下子字符串?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct st_ex {
char product[16];
float price;
};
struct st_temp {
char *prod;
};

char *temp = NULL;

// from stackoverflow
char* substr( const char* source, size_t start, size_t end )
{
char* dest = malloc( end - start + 1) ;
memcpy( dest, &source[start], end - start ) ;
dest[end - start] = 0 ;
return dest ;
}

int main()
{
struct st_ex structs[] = {{"mp3 player", 2.0f}, {"plasma tv", 20.0f},
{"notebook", 10.0f}, {"smartphone", 49.9f},
{"dvd player", 10.0f}, {"matches", 0.2f }};
struct st_temp **temp_struct;

size_t j, i;
temp_struct = malloc(sizeof *temp_struct * 6);
for (j = 0; j < 6; j++)
temp_struct[j] = malloc(sizeof *temp_struct[j]);

size_t structs_len = sizeof(structs) / sizeof(struct st_ex);

// NOTE: that structs_len may vary in size - not just 6
for(i=0; i<structs_len; i++){
if (i == 0)
temp_struct[i]->prod = "+";
else if(i == 1)
temp_struct[i]->prod = "Bar";
else if(i == 5)
temp_struct[i]->prod = "Foo";
else {
temp = substr(structs[i].product, 0, 4);
temp_struct[i]->prod = temp;
}
}
for(i=0; i<6; i++ )
printf("%s\n",temp_struct[i]->prod);

for(i = 0; i < 6; i++ ){
/* can I do something like this? */
/*if (i != 0 || i != 1 || i != 5)*/
free(temp_struct[i]->prod);
free(temp_struct[i]);
}
free(temp_struct);
return 0;
}

最佳答案

问题是有时您将 temp_struct[i]->prod 设置为带引号的字符串(“Bar”),您无法释放它,有时设置为 substr 调用的结果,您必须免费。

最简单的解决方案是始终将其设置为必须释放的字符串。

  temp_struct[i]->prod = new_string("Bar");

在哪里

char* new_string( const char* source )
{
char* dest = malloc( strlen(source) + 1 ) ;
strcpy(dest, source);
return dest ;
}

或者,你必须跟踪是否需要释放

 struct st_temp {
char *prod;
int prod_must_be_freed;
};

将 prod_must_be_freed 设置为 0 或 1 并在释放之前检查。

最后,通过使用函数来操纵这些结构,而不是直接摆弄它们,整个事情将会得到改善。然后你可以制作一个 free_st_temp(st_temp*) 检查是否应该释放 prod,然后释放结构。你的循环将是

for(i = 0; i < 6; i++ ){    
free_st_temp(temp_struct[i]);
}

关于c - 释放子串而不在c中做双重释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3196560/

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