我认为这应该很快。
编辑:这是我的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中的字符串复制到一个新字符串中,但我一定是做错了,因为我最终得到了大量的混乱。
那么,你们都在想什么?
答案 0 :(得分:0)
什么是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()
)。