下面的函数应该更改为大写第一个中第二个字符串的所有出现。 当它匹配第一个字母时,它应该将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;
}
答案 0 :(得分:1)
当函数(或进程)尝试访问超出其绑定的内存时,会发生分段错误。
在这种情况下,看起来你正在将指针传递给函数(ds.groupby('time.year').mean('time')
)。如果调用者没有使用*s
在堆上为该字符串分配空间,则该变量默认位于调用函数的malloc
上。
每个函数都有自己的stack
,访问堆栈框架外的内存将导致stack frame
。因此,当将segmentation fault
传递给此函数时,您(可能,我必须看到调用者确切知道:))将指针传递给不属于堆栈帧的char数组。因此,您获得了s*
,因为您尝试访问地址segmentation fault
处的内容,但此功能不允许访问该空间。
答案 1 :(得分:0)
你开始做一个toupper的东西,你的代码中的一个元素p [j]指向匹配后的第一个调用。