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

标签 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;
}

最佳答案

当函数(或进程)尝试访问超出其范围的内存时,就会发生段错误。 在本例中,您似乎将一个指针传递到函数中 (*s)。如果调用者尚未使用 malloc 在堆上为该字符串分配空间,则该变量默认位于调用函数的 stack 上。 每个函数都有自己的堆栈帧,访问堆栈帧之外的内存将导致段错误。因此,当将 s* 传递到此函数时,您(可能,我必须看到调用者才能确定:))传递一个指向不属于您的 char 数组的指针堆栈框架。因此,您会遇到段错误,因为您尝试访问地址s*[j]处的内容,但不允许此函数访问该空间。

关于c - C中的段错误,无法找出原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39986168/

相关文章:

整个程序中__TIME__的常量值

c - 在 C 中将字符串存储到 Char 数组中 & 段错误

c++ - 指针类型的结构还是指针的结构?

c++ - 指向右值对象成员变量的指针

c++ - 指针可以指向一个值,指针值可以指向地址吗?

c - 检查地址范围是否在进程地址空间中的石蕊测试?

python - 确定 python 子进程段错误

无法在 Ubuntu 上编译 CUDA 库 : Works on Mac,

c - OpenGL 凹凸贴图不起作用

c - 如何将数据添加到txt文件的新行