字符串声明中`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 *str
和 char str[]
有什么区别?
2. 我的分词错误从何而来?
char str[] = "abcdefg";
和
char *str = "abcdefg";
是两个不同的东西。
第一个是数组,用"abcdefg"
初始化。
第二个是指向字符串文字的指针 "abcdefg"
.
在第二种情况下,当您尝试修改字符串文字时,您会调用 undefined behavior,因为任何修改字符串文字的尝试都是 UB。
我在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 *str
和 char str[]
有什么区别?
2. 我的分词错误从何而来?
char str[] = "abcdefg";
和
char *str = "abcdefg";
是两个不同的东西。
第一个是数组,用
"abcdefg"
初始化。第二个是指向字符串文字的指针
"abcdefg"
.
在第二种情况下,当您尝试修改字符串文字时,您会调用 undefined behavior,因为任何修改字符串文字的尝试都是 UB。