gpt4 book ai didi

c - 修改C字符串常量?

转载 作者:行者123 更新时间:2023-11-30 17:31:53 25 4
gpt4 key购买 nike

Possible Duplicate:
Why do I get a segmentation fault when writing to a string?

我想编写一个函数来反转传递给它的给定字符串。但是我不能。如果我提供 doReverse函数(参见下面的代码)与字符数组,我的代码运行良好。

我不明白为什么这不起作用。我可以访问 str[0]doReverse ,但我无法使用 char 指针更改数组的任何值。有什么想法吗?

void doReverse(char *str) {
str[0] = 'b';
}

void main(void) {
char *str = "abc";
doReverse(str);
puts(str);
}

更新:

我知道如何通过向其传递字符数组来编写反向函数:

void reverse1(char p[]) {
int i, temp, y;

for (i = 0, y = strlen(p); i < y; ++i, --y) {
temp = p[y-1];
p[y-1] = p[i];
p[i] = temp;
}
}

但是,我想编写另一个版本,将 char 指针作为参数。

最佳答案

由于您正在准备考试,我将充实我的评论以解释实际发生的情况:

char *str = "abc";

str 是存储在堆栈上的指针。它被初始化为指向文字字符串“abc”。该文字字符串将存储在已编译的可执行文件的数据部分中,并在加载程序时加载到内存中。该内存部分是只读的,因此当您尝试修改 str 指向的数据时,您会遇到访问冲突。

char* str = malloc(sizeof(char) * 4);
strcpy(str, "abc");

这里,str 是与第一个示例相同的堆栈指针。这次,它被初始化为指向堆上可以读写的 4 字符内存块。起初,该内存块未初始化,可以包含任何内容。 strcpy读取存储“abc”的只读内存块,并将其复制到str指向的读写内存块中。请注意,设置 str[3] = '\0' 是多余的,因为 strcpy 已经这样做了。

顺便说一句,如果您在 Visual Studio 中工作,请使用 strcpy_s 代替,以确保在复制的字符串比您预期的长度长时不会覆盖缓冲区。

char str[] = "abc"; 

这里的str现在是在堆栈上分配的数组。编译器将调整它的大小,使其完全适合用于初始化它的字符串文字(包括 NULL 终止符)。堆栈内存是可读写的,因此您可以根据需要修改数组中的值。

char str[4] = "abc";

这实际上与以前的版本相同,只是您告诉编译器您比它更知道数组应该有多长。如果更改字符串而不是数组大小,可能会遇到麻烦。

关于c - 修改C字符串常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24424719/

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