【问题标题】:C99 Segmentation Overflow strlen, not consistent [closed]C99分段溢出strlen,不一致[关闭]
【发布时间】:2013-03-12 01:31:42
【问题描述】:

我一直在寻找这个问题的答案,但似乎找不到解决方案。当参数长度不同时,没有错误。当它们的长度相同时,会发生段错误。该函数旨在比较两个字符串并返回一个新字符串,其中包含每个第 i 个字符中的最大值。我的功能如下:

   char* charMax(char* string1, char* string2) 
   {
        int length1 = strlen(string1);
        printf("%d", length1);
        int length2 = strlen(string2);

        int lengthLarge = length1 >= length2 ? length1 : length2;
        int lengthSmall = length1 <= length2 ? length1 : length2;

        char* largerString = length1 >= length2 ? string1 : string2;
        char* result = malloc(lengthLarge + 1);


        for (int i = 0; i < lengthSmall; i++) 
            result[i] = string1[i] > string2[i] ? string1[i] : string2[i];

        if (length1 != length2) 
        {
            for (int i = lengthSmall; i < lengthLarge; i++) 
                result[i] = largerString[i];

            result[lengthLarge + 1] = '\0';

            return result;

            free(result);
        }
    }

感谢您的帮助!

【问题讨论】:

    标签: c segmentation-fault c99 strlen


    【解决方案1】:

    嗯,这可能与这样一个事实有关,即当两个字符串的长度完全相同时,您的函数永远不会返回任何内容,因此它的结果是 garbage。然后将其解释为指针。还有……嗯……你知道接下来会发生什么,不是吗?

    让我们适当地缩进该代码并添加一些注释,好吗?

    char* charMax(char* string1, char* string2) {
        int length1 = strlen(string1);
        printf("%d", length1);
        int length2 = strlen(string2);
        int lengthLarge = length1 >= length2 ? length1 : length2;
        int lengthSmall = length1 <= length2 ? length1 : length2;
    
        char* largerString = length1 >= length2 ? string1 : string2;
        char* result = malloc(lengthLarge + 1);
    
        for (int i = 0; i < lengthSmall; i++) {
            result[i] = string1[i] > string2[i] ? string1[i] : string2[i];
        }
        if (length1 != length2) {
            for (int i = lengthSmall; i < lengthLarge; i++) {
                result[i] = largerString[i];
            }
    
            result[lengthLarge + 1] = '\0';
    
            return result;
    
            free(result); /* uhm, what? this will never execute */
        }
    
        /* oops - what happens now? who knows? */
    }
    

    【讨论】:

    • 我把括号放错地方了。多么愚蠢的错误。谢谢。
    【解决方案2】:

    有几个问题,Nik 的回答指出了主要问题。另一个在这里:

    result[lengthLarge + 1] = '\0'; // out of bounds! 
    // this should be result[lengthLarge] = '\0'
    

    此外,此签名更适合您的目的:

    char* charMax(const char *string1, const char *string2);
    

    【讨论】:

    • 好收获!我完全错过了!
    • 感谢您的帮助。我是 C 新手,char* string1 和 char *string1 有什么区别?我理解 char string1[] 之间的区别,但我没有意识到还有另一种选择。
    • @user2159044,它们完全相同,但指针定义通常写在变量名而不是类型旁边(int a, *b 定义整数和指针)。我实际上建议使用const 来传递文字字符串。
    • @user2159044 - @perreal 主要指的是使用 const 而不是 '*' 的位置。 const 向(函数的)调用者表明传递的值不会被修改。
    猜你喜欢
    • 1970-01-01
    • 2021-02-16
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多