jam*_*mes 29 c string segmentation-fault
我正在尝试编写代码来反转字符串(我只是想在C编程和指针操作方面做得更好),但我无法弄清楚为什么我会遇到分段错误:
#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
}
}
Run Code Online (Sandbox Code Playgroud)
它是第2行和第3行导致分段错误.我知道可能有更好的方法来做到这一点,但我有兴趣找出我的代码中特别导致分段错误的内容.
更新:我已根据要求包含了调用函数.
AnT*_*AnT 50
只有那段代码没有办法说出来.最有可能的是,您传入的指针指向无效内存,不可修改的内存或其他类型的内存,这些内存无法按照您在此处理的方式进行处理.
你怎么称呼你的功能?
补充:您正在传递指向字符串文字的指针.字符串文字是不可修改的.你不能反转字符串文字.
传入指向可修改字符串的指针
char s[] = "teststring";
reverse(s);
Run Code Online (Sandbox Code Playgroud)
这已经在这里被解释为死亡."teststring"是一个字符串文字.字符串文字本身是一个不可修改的对象.实际上,编译器可能(并将把它)放在只读存储器中.初始化这样的指针时
char *s = "teststring";
Run Code Online (Sandbox Code Playgroud)
指针直接指向字符串文字的开头.s在一般情况下,任何修改指向的内容的尝试都被视为失败.你可以阅读它,但你不能写入它.因此,强烈建议仅使用指针到const变量指向字符串文字
const char *s = "teststring";
Run Code Online (Sandbox Code Playgroud)
但当你宣布你s的时候
char s[] = "teststring";
Run Code Online (Sandbox Code Playgroud)
你得到一个完全独立的数组,s位于普通的可修改内存中,只是用字符串文字初始化.这意味着该独立可修改数组s将从字符串文字中复制其初始值.之后,您的s数组和字符串文字继续作为完全独立的对象存在.文字仍然是不可修改的,而你的s数组是可修改的.
基本上,后一种声明在功能上等同于
char s[11];
strcpy(s, "teststring");
Run Code Online (Sandbox Code Playgroud)
由于多种原因,您的代码可能是segfaulting.以下是我想到的
我认为#2是最有可能的.你能告诉我们反向的呼叫站点吗?
编辑
根据您的样本#2绝对是答案.C/C++中的字符串文字不可修改.适当的类型实际上是,const char*而不是char*.您需要做的是将可修改的字符串传递到该缓冲区.
快速举例:
char* pStr = strdup("foobar");
reverse(pStr);
free(pStr);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6610 次 |
| 最近记录: |