首页 > 解决方案 > 尽管小于长度,但 C 字符串索引上的分段错误

问题描述

我的代码中 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;
}

输出:

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)   

标签: cstring

解决方案


ex指向一个常量(称为“字符串文字”)。然后你尝试修改ex指向的东西。但是你不能修改常量——这就是使它们成为常量的原因。


推荐阅读