gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:40:55 25 4
gpt4 key购买 nike

我不明白为什么我会从这段代码中得到段错误,并且当我使用数组而不是指针时它会起作用,如果有人能让我理解这一点,我会很高兴。

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';
}

最佳答案

Thank you. I'm doing a lot of c programming and its really weird that i never faced that before.

可能是因为您没有意识到有不同的存储方式C 弦。您可能很幸运,从未遇到过段错误因为这个。

字符串文字

字符串文字用双引号声明,例如

"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 个字节的内容。

您还可以声明一个固定大小的数组。在这种情况下,尺寸必须是至少与字符串文字的长度+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

但我不确定如果你执行代码会发生什么。我认为这是未定义行为的情况这意味着:任何事情都有可能发生。

就我个人而言,我通常声明我的字符串没有固定大小,除非有具有固定大小的原因。

关于c - 奇怪的段错误(数组和指针之间的区别?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55291177/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com