Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C字符串索引上的分段错误,尽管长度小于_C_String - Fatal编程技术网

C字符串索引上的分段错误,尽管长度小于

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

我的代码中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_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)