繁体   English   中英

奇怪的分段错误(数组和指针之间的区别?)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM