下面的函数应该将第一个字符串中出现的所有第二个字符串更改为大写。 当它匹配第一个字母时,它应该将 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/