谁能帮我理解这个 strchr() C 分段错误?

Could anyone help me to understand this strchr() C Segmentation fault?

我正在深入研究 C 中的指针和字符串,但我仍然不习惯一些概念。我试图实现 strchr() 函数的一个版本——与 string.h 中的相同——出于学习目的,但一些基本的东西仍然不正确。

这是我的代码:

#include <stdio.h>

char* my_strchr(const char* str, int c){
  if (str == NULL){
    printf("STR is NULL. Finishing the program\n");
    return NULL;
  }
  while (*str != '[=10=]'){
    if (*str == c){
      return (char*) str;
    }
    str++;
  }
  return NULL;
}

int main(){
  char *a = "Hello World!";
  char *b;
  char c;

  printf("Type the character you want to find in the Hello World! string:\n");
  scanf(" %c", &c);

  b = my_strchr(a, c);

  printf("Character found! %c\n", *b);

  return 0;
}

我想弄清楚为什么这是 return 分段错误。当我使用 gbd 时,它告诉我错误在最后一个 printf,它试图打印 *b.

一旦 my_strchr() return 成为 (char*) str,我必须将此 return 值存储在 char 指针变量中,对吗?

my_strchr在字符串中找不到字符时,它returns NULL.

在这种情况下 bNULL 所以 *b 是未定义的行为,这解释了段错误。

您可能想在打印 *b 之前检查 my_strchr 的结果,例如:

if (b != NULL) {
  printf("Character found! %c\n", *b);
} else {
  printf("Not found...\n");
}

tuple_cat 说的有一些逻辑问题。

但我也认为你不理解某些概念,从我的角度来看你的代码不干净。

我猜你刚开始用 c 编写代码,所以请继续编写代码:)

首先你在你的函数中 return 一个 char* 但你将函数的参数定义为

char* my_strchr(const char* str, int c)

在标准 C 中,您不能修改常量,也不能修改它,这就是声明常量的意义所在。

所以把函数改成

char* my_strchr(char* str, int c)

那么从字符串 return 一个字符的正确方法不是

return (char*)str;

但只是

return str;

在你的函数结束时。

这样您将发送 char*(字符串)中第一个字符的地址。 在 char* 中,您只需提供变量名称即可。

我鼓励您阅读:https://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html

RTFM!!! 1.3.4 String Constants

中的 char* 部分

总之祝你学习顺利。