字符串声明中`char *str`和`char str[]`的区别

The difference between `char *str` and `char str[]` in the declaration of a string

我在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. Return 1 如果测试的字符是字母
2. 小写转大写
3.否则,return0(表示不是字母)

我选择了地址传参,因为我想在内存中改变传参的值c

现在我的问题来了: 我用以下代码测试了我的功能:

char str[] = "abcdefg";
printf("Before: %s\n", str);    
TransMinMaj(&str[1]);
printf("After: %s\n", str);

到目前为止,一切都很好,没有错误,没有警告。正如你所看到的,在这个测试中,我将内存中的小写字母b(也是字符串(字符数组)的第二个元素)转换为大写字母'B'。

但是,如果稍微更改一下测试代码:

char *str = "abcdefg";
printf("Before: %s\n", str);    
TransMinMaj(&str[1]);
printf("After: %s\n", str);

存在分段错误(核心已转储)。 但我不知道为什么。
所以我的问题来了:
1. 声明中 char *strchar str[] 有什么区别?
2. 我的分词错误从何而来?

char str[] = "abcdefg";

char *str = "abcdefg";

是两个不同的东西。

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

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

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