在C代码中免费的地方

时间:2018-01-17 23:54:54

标签: c arrays copy malloc

我有一个有效的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;
}

2 个答案:

答案 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。当然,为了 像这样的简单程序,你可以跳过它。但是在一个更大的项目中,你 肯定应该检查一下。