我在C中有以下功能:
int TransMinMaj(char *c)
{
if((*c) >= 'a' && (*c) <= 'z')
{
*c += 'A' - 'a';
return 1;
}
else if((*c) >= 'A' && (*c) <= 'Z')
return 1;
return 0;
}
如您所见,此功能:
1.如果测试的字符是一个字母,则返回1
2.将小写字母转换为大写字母
3.否则,返回0(表示它不是字母)
我选择按地址传递参数,因为我想更改内存中传递的参数c
的值。
现在我的问题来了: 我使用以下代码测试了我的函数:
char str[] = "abcdefg";
printf("Before: %s\n", str);
TransMinMaj(&str[1]);
printf("After: %s\n", str);
直到现在,一切都很好,没有错误,没有警告。正如您所看到的,在此测试中,我将小写字母b
(也是字符串的第二个元素(字符数组))转换为大写字母&#39; B&#39;在记忆中。
但是,如果将测试代码更改为litte:
char *str = "abcdefg";
printf("Before: %s\n", str);
TransMinMaj(&str[1]);
printf("After: %s\n", str);
存在分段错误(核心转储)。
但我不知道为什么。
所以这是我的问题:
1.声明中char *str
和char str[]
之间有什么区别?
2.我的细分错误来自哪里?
答案 0 :(得分:2)
char str[] = "abcdefg";
和
char *str = "abcdefg";
是两件不同的事情。
第一个是数组,初始化为"abcdefg"
。
第二个是指向字符串文字 "abcdefg"
的指针。
在第二种情况下,当您尝试修改字符串文字时,调用undefined behavior,因为任何修改字符串文字的尝试都是UB。