[英]Weird segmentation fault (difference between arrays and pointers ?)
我看不到为什么我会从这段代码中得到分段错误,并且以某种方式当我使用数组而不是指针时它起作用了,如果有人能让我理解这一点,我会很高兴。
void main() {
char *str = "example string";
wrapChrInStr(str, 'a');
}
void wrapChrInStr(char *str, unsigned char chr) {
char *ptr = str;
char c;
while((c = *ptr)) {
if(c != chr) {
*str = c;
str++;
ptr++;
} else {
ptr++;
}
}
*str = '\0';
}
谢谢。 我正在做大量的C编程,这真的很奇怪,我以前从未遇到过。
可能是因为您没有意识到存储C-String有不同的方式。 因此,您可能很幸运,从未遇到过段错误。
字符串文字
字符串文字用双引号声明,例如
"hello world"
该字符串通常存储在只读部分中。 当使用字符串文字时,最好用这样的const
声明变量:
const char *str = "hello world";
有了这个,您知道str
指向只读内存位置,并且您无法操纵字符串的内容。 实际上,如果您这样做:
const char *str = "hello world";
str[0] = 'H';
// or the equivalent
*str = 'H'
编译器将返回如下错误:
a.c:5:5: error: assignment of read-only location ‘*str’
我发现这非常有帮助,因为您不能意外地操纵str
指向的内容。
数组
如果需要操纵字符串的内容,则需要将字符串存储在数组中,例如
char str[] = "hello word";
在这种情况下,编译器知道字符串文字包含10个字符,并为str
保留11个字节( '\\0'
1个字节-终止字节),并使用字符串文字的内容初始化数组。
在这里您可以做类似的事情
str[0] = 'H'
但是您不能访问超出第11个字节的内容。
您还可以声明一个固定大小的数组。 在这种情况下,大小必须至少与字符串文字的length + 1相同。
char str[11] = "Hello world";
如果声明较少的空间(例如char str[3] = "hello world";
),则编译器将通过类似以下内容警告您
a.c:4:14: warning: initializer-string for array of chars is too long
但是我不确定如果仍然执行代码会怎样。 我认为这是行为未定义的情况,这意味着:任何事情都可能发生。
就我个人而言,我通常声明我的字符串不使用固定大小,除非有理由使用固定大小。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.