字符串

时间:2016-09-09 07:35:27

标签: c arrays string string-literals

我在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 *strchar str[]之间有什么区别?
2.我的细分错误来自哪里?

1 个答案:

答案 0 :(得分:2)

char str[] = "abcdefg";

char *str = "abcdefg";

是两件不同的事情。

  • 第一个是数组,初始化为"abcdefg"

  • 第二个是指向字符串文字 "abcdefg"的指针。

在第二种情况下,当您尝试修改字符串文字时,调用undefined behavior,因为任何修改字符串文字的尝试都是UB。