gpt4 book ai didi

c - 为什么这个字符串反转 C 代码会导致段错误?

转载 作者:行者123 更新时间:2023-11-30 17:14:56 24 4
gpt4 key购买 nike

我正在尝试编写代码来反转字符串(我只是想更好地进行 C 编程和指针操作),但我不明白为什么我会得到 segmentation fault :

#include <string.h>

void reverse(char *s);

int main() {
char* s = "teststring";
reverse(s);

return 0;
}

void reverse(char *s) {
int i, j;
char temp;

for (i=0,j = (strlen(s)-1); i < j; i++, j--) {
temp = *(s+i); //line 1
*(s+i) = *(s+j); //line 2
*(s+j) = temp; //line 3
}
}

第 2 行和第 3 行导致了段错误。我知道可能有更好的方法来做到这一点,但我有兴趣找出我的代码中具体是什么导致了段错误。

更新:我已按要求添加了调用功能。

最佳答案

仅凭该代码无法判断。最有可能的是,您传入的指针指向无效内存、不可修改的内存或无法按照您在此处处理的方式进行处理的某种其他类型的内存。

你如何调用你的函数?

添加:您正在传递一个指向字符串文字的指针。字符串文字是不可修改的。您无法反转字符串文字。

传入一个指向可修改字符串的指针

char s[] = "teststring";
reverse(s);

这已经在这里解释得很清楚了。 "teststring" 是一个字符串文字。字符串本身是一个不可修改的对象。实际上,编译器可能(并且将会)将其放入只读内存中。当你初始化这样的指针时

char *s = "teststring";

指针直接指向字符串文字的开头。一般情况下,任何修改 s 所指向内容的尝试都会被视为失败。你可以读取它,但你不能写入它。因此,强烈建议仅使用指向 const 变量的指针来指向字符串

const char *s = "teststring";

但是当您将 s 声明为

char s[] = "teststring";

你会得到一个位于普通可修改内存中的完全独立的数组s,它只是用字符串文字初始化。这意味着独立的可修改数组 s 将从字符串文字中获取其复制的初始值。之后,您的 s 数组和字符串文字继续作为完全独立的对象存在。文字仍然不可修改,而您的 s 数组是可修改的。

基本上,后一个声明在功能上等同于

char s[11];
strcpy(s, "teststring");

关于c - 为什么这个字符串反转 C 代码会导致段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30132504/

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