C字符串索引上的分段错误,尽管长度小于
我的代码中cstr的长度是strlen()的3。我正在对cstr的索引0进行解引用,但这给了我该行的分段错误(第34行)。我真的很困惑。有人能解释为什么会这样吗C字符串索引上的分段错误,尽管长度小于,c,string,C,String,我的代码中cstr的长度是strlen()的3。我正在对cstr的索引0进行解引用,但这给了我该行的分段错误(第34行)。我真的很困惑。有人能解释为什么会这样吗 #include <stdio.h> #include <string.h> char *reverse_words(char *cstr); int main() { char *ex = "cat"; printf("%s", reverse_wor
#include <stdio.h>
#include <string.h>
char *reverse_words(char *cstr);
int main() {
char *ex = "cat";
printf("%s", reverse_words(ex));
return 0;
}
char *reverse_words(char *cstr) {
int len = strlen(cstr);
int s_len = 0;
int s_len_prev = 0;
while (s_len < len) {
while (cstr[s_len] != 32 && s_len < len) {
s_len++;
}
printf("len: %d\n", len);
printf("s_len: %d\n", s_len);
for (int i = s_len_prev; i < s_len; i++) {
printf("%d\n", i);
if (i == (s_len / 2)) {
break;
}
char temp1 = cstr[i];
char temp2 = *(cstr + s_len - i - 1);
printf("*(cstr + i): %c\n", cstr[i]);
printf("*(cstr + s_len - i - 1): %c\n", *(cstr + s_len - i - 1));
printf("s_len - i - 1: %d\n", s_len - i - 1);
printf("len: %d\n", len);
*(cstr + i) = temp2;
*(cstr + s_len - i - 1) = temp1;
}
s_len++;
s_len_prev = s_len;
}
return cstr;
}
您使
ex
指向一个常量(称为“字符串文字”)。然后尝试修改ex
指向的对象。但是你不能修改一个常量——这就是它们成为常量的原因。这在C中是未定义的行为,因为“cat”可以放在可执行文件的某个只读区域上。如果不将指针指定为const
以避免此错误,某些编译器将不允许使用char*cstring=“text”
。通过将其设置为数组char ex[]
可以保证它是可写的。您可以在此处阅读更多信息欢迎来到Stack Overflow;如果你在代码的非现场图片(我们无法剪切和粘贴)中显示实际的代码,你很可能会得到一些帮助。这可能是旧的“尝试更改可选字符串”把戏。(这是本周的两次:)-试试charex[]=“cat”代码>而不是char*ex=“cat”代码>谢谢,我把它改成char ex[]=“cat”后就可以工作了;
len: 3
s_len: 3
0
*(cstr + i): c
*(cstr + s_len - i - 1): t
s_len - i - 1: 2
len: 3
Segmentation fault (core dumped)