我有一个有效的C代码。它连接2个char数组并打印出解决方案。
但我在这里有一个动态内存管理(malloc),现在必须释放它。
有人可以告诉我在哪里自由吗?为什么?
char * stringcat(const char * str1, const char * str2) {
int length_1 = strlength(str1);
int length_2 = strlength(str2);
int length = length_1 + length_2 + 1;
char * newstr = malloc(sizeof(char) * length);
for(int i=0; i < length; i++)
{
char charToCopy = '\0';
if(i < length_1)
{
charToCopy = *(str1 + i);
} else if(i < (length_1 + length_2)) {
charToCopy = *(str2 + i - length_1);
}
*(newstr + i) = charToCopy;
}
return newstr;
}
int strlength(char *c) {
int count = 0;
while(*(c + count) != '\0') {
count++;
}
return count;
}
int main() {
char surname[] = "Simon";
char lastname[] = "Arndt";
printf("%s\n", stringcat(surname, lastname));
return 0;
}
答案 0 :(得分:2)
您泄漏了内存,因为您未将stringcat
的结果分配给char *
。这样做。然后free
在你之后print
。或者(在这里介绍的一个简单的程序中)不要担心它,让main
退出导致它。
char *name = stringcat(surname, lastname);
printf("%s\n", name);
free(name);
答案 1 :(得分:2)
通常你应该在你不再需要它的地方释放内存。为此,你应该将指针存储在某处。
int main() {
char surname[] = "Simon";
char lastname[] = "Arndt";
char *res;
res = stringcat(surname, lastname); // first store it
if(res == NULL)
{
fprintf(stderr, "error");
return 1;
}
// then print it
puts(res); // equivalent to printf("%s\n", res);
free(res);
return 0;
}
不要忘记C-Strings是\0
- 终止,这意味着当你
为字符串动态分配内存,至少应该分配
strlen(string) + 1
:
char * newstr = malloc(length + 1);
if(newstr == NULL)
return NULL;
如果是字符串,则不需要sizeof(char)
,因为它总是一个。
对于其他类型,请避免使用sizeof(<type>)
,这很容易出错。
而是这样做:
int *arr = malloc(10 * sizeof *arr);
sizeof *arr
将始终返回正确的字节数。
修改强>
您应始终检查malloc
是否未返回NULL
。当然,为了
像这样的简单程序,你可以跳过它。但是在一个更大的项目中,你
肯定应该检查一下。