C中的分段错误,无法找出原因

时间:2016-10-11 20:28:37

标签: c pointers segmentation-fault

下面的函数应该更改为大写第一个中第二个字符串的所有出现。 当它匹配第一个字母时,它应该将p指向它在第一个字符串中的位置,然后检查匹配字符串的剩余部分。如果匹配发生,则用其大写版本替换每个字符。 当我尝试访问p得到的值时,我得到"分段错误" 我知道这个程序有很多问题:我可以在i中存储第一个字符的位置,并使用i + j作为第一个字符串的索引。我也没有检查第二个字符串是否只包含字母。 无论如何,我真的想知道在这个特定情况下使用指针有什么问题,即使我可以重写它的更好版本。

char *matchToUp(char *s, char *match)
{
    int i = 0, j=0;
    char *p = s;

    while (s[i] != '\0')
    {
        while(s[i]!= match[0] && s[i]!= '\0')
        {

            i++;
        }
        printf("%d", i);
        p = &s[i];
        while (match[j] != '\0' &&p[j] == match[j])
        {
            j++;
        }
        if(match[j] == '\0')
        {
            printf("%d", j);
            while(j >= 0)
            {
                p[j] = (char) toupper((unsigned int) p[j]);
                j--;
                i++;

            }
        }
        else
        {
            j=0;
            i++;

        }
    }


    return s;
}

2 个答案:

答案 0 :(得分:1)

当函数(或进程)尝试访问超出其绑定的内存时,会发生分段错误。 在这种情况下,看起来你正在将指针传递给函数(ds.groupby('time.year').mean('time'))。如果调用者没有使用*s在堆上为该字符串分配空间,则该变量默认位于调用函数的malloc上。 每个函数都有自己的stack,访问堆栈框架外的内存将导致stack frame。因此,当将segmentation fault传递给此函数时,您(可能,我必须看到调用者确切知道:))将指针传递给不属于堆栈帧的char数组。因此,您获得了s*,因为您尝试访问地址segmentation fault处的内容,但此功能不允许访问该空间。

答案 1 :(得分:0)

你开始做一个toupper的东西,你的代码中的一个元素p [j]指向匹配后的第一个调用。