简单的strcat()包装函数的分段错误

时间:2011-11-07 15:41:42

标签: c

我有一个练习,我需要为strcat编写一个包装函数。在打印字符串长度(用于调试)后,它会出现故障,我不太清楚为什么。任何帮助将不胜感激。

编辑:我没有指定包装函数应该保证它永远不会超出为目标分配的内存范围。这就是为什么我在目标中为“string”分配了足够的内存并在Strcat()包装器中重新分配更多内容。

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

    char* Strcat(char* destination, const char* source);

    int main(void)
    {
        (void)printf("This strcat cannot fail!\n");
        char* destination = (char*)malloc(sizeof(char)*7);
        destination = "string";
        (void)printf("%s\n", destination);
        Strcat(destination, " concatination");
        (void)printf("%s\n", destination);
        (void)printf("It works!\n");

        free(destination);

        return 0;
    }

    char* Strcat(char* destination, const char* source)
    {
        (void)printf("%d\n", (strlen(destination)+strlen(source))*sizeof(char));
        if((sizeof((strlen(destination)+strlen(source)))+1) > sizeof(destination))
            destination = (char*)realloc(destination, sizeof((strlen(destination)+strlen(source)))+1);
        return strcat(destination, source);
    }

3 个答案:

答案 0 :(得分:2)

这一行:

destination = "string";

覆盖从malloc(3)返回的指针,这样你就会永远失去那个记忆。您可能打算复制该字符串,因此请使用strcpy(3)或其他内容。

答案 1 :(得分:1)

    if((sizeof((strlen(destination)+strlen(source)))+1) > sizeof(destination))

那是错的,sizeof没有给你任何与字符串长度相当的东西。不要在这里使用它。

此外,您无法真正获得字符串的已分配字节数。因此,如果您知道目的地已分配malloc [*],则应无条件realloc

        destination = (char*)realloc(destination, strlen(destination)+strlen(source)+1);

再次,没有sizeof。并准备好处理分配失败,这意味着保存destination的旧值并在realloc返回0时释放它。

[*]请注意destination = "string"打破了这个前提。

答案 2 :(得分:0)

尝试像

这样的summat
char *Strcat(char *d, const char *s) /* please put in the proper names - i am being lazy*
{
   int dLen = strlen(d); /* ditto above */
   int sLen = strlen(s);
   d = (char *)realloc(d, dLen + sLen +1);
   return strcat(d, s);
}