我认为这个应该很快。
编辑:这是给我的CS113班的。我只需要释放所有的记忆。如果Valgrind发现任何内存泄漏,我会丢分P
无论如何,我发现它显然只需要我在Main中释放与zero_pad返回值相关的内容。一旦我这么做了,效果就很好。如果我知道怎么做的话,我会把这篇文章标记为"完整"。
char *zero_pad(struct cpu_t *cpu, char *string)
{
char *zero_string = malloc(cpu->word_size + 1);
int num_zeros = ((cpu->word_size) - strlen(string));
int i;
for(i = 0; i < num_zeros; i++)
{
zero_string[i] = '0';
}
return strncat(zero_string, string, strlen(string));
}
我需要释放zero_string,因为我已经分配了它。但是,我不知道怎么做。如果我在返回之前释放它,那么我已经丢失了数据,无法返回。如果我在之后尝试释放它,函数已经返回,因此无法继续释放它。
我试图使用strcpy将zero_string中的字符串复制到一个新的字符串中,但我一定做错了,因为我最终得到了一个巨大的混乱。
那么,你们都怎么想呢?
什么是cpu->word_size
?你确定cpu->word_size >= strlen(string)
在任何情况下?
无论如何,返回的缓冲区是mallocated的,因此调用方有责任释放它。另一种可能性是,如果您知道所需的最大大小,则使用静态变量。这就是代码。
#define MAX_SIZE 128 /* adjust this */
char *zero_pad(struct cpu_t *cpu, char *string)
{
static char zero_string[MAX_SIZE];
int num_zeros = ((cpu->word_size) - strlen(string));
int i;
for(i = 0; i < num_zeros; i++)
{
zero_string[i] = '0';
}
strcpy(zero_string + i, string);
return zero_string;
}
显然,应该通知调用者返回的缓冲区总是相同的(如果需要,调用者必须复制返回的缓冲区时,例如使用strdup()
和稍后的free()
)。