C 中的分段错误

Segmentation Fault in C

我的代码出现分段错误,我似乎找不到我做错了什么:

#include <stdio.h>
#include <string.h>
char find(char name[], char allNames[][10], int length)
{
int i=0;
for (i = 0; i < length; i++) {
if (strcmp(allNames[i],name) == 1) {
printf("%i",i);
return *name;
}
}
return -1;
}

main(){
  char allNames[][10] = {"cat","dog","frog","log","bog"};
  char name[] = "log";
int length=5;
  printf("%s",find(name,allNames,length));

}

我真的很想了解这里发生的所有机制以及我在明天的考试中做错了什么。感谢您的帮助!

编辑: 非常感谢大家的回答和信息!我对 C 真的很陌生,只是习惯了每件事的含义。我正在查看的特定考试问题是:

(a) 下面这个函数的目的是在数组中查找字符串名称 所有名称。如果找到,它 returns 名称在数组中的位置。如果不 发现,它returns-1。修改代码使其正常工作。

int find(char name[], char allNames[][10])
{
for (i = 0; i < 10; i++) {
if (allNames[i] == name) {
return name;
}
}
return -1;
}

我正在尝试让一个程序在这些参数范围内工作。干杯:)

http://coliru.stacked-crooked.com/a/d400c9a56d732446

#include <stdio.h>
#include <string.h>
char* find(char name[], char allNames[][10], int length)
{
    int i=0;
    for (i = 0; i < length; i++) {
        if (!strcmp(allNames[i],name)) {
            printf("%i",i);
            return name;
        }
    }
    return NULL;
}

int main(){
  char allNames[][10] = {"cat","dog","frog","log","bog"};
  char name[] = "log";
  int length=5;
  printf("%s",find(name,allNames,length));

}

如果您尝试 return 字符串,则返回单个 char 对您没有好处。如果找不到字符串,我还建议您 return a NULL

此外,在 main 之前包含 int;这是更好的风格。

这段代码在几个层面上是错误的。

gcc -Wall -Wextra 显示:

meh.c:15:1: warning: return type defaults to ‘int’ [-Wreturn-type]
 main(){
 ^
meh.c: In function ‘main’:
meh.c:19:3: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat=]
   printf("%s",find(name,allNames,length));
   ^
meh.c:21:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^

这是怎么回事?您是否在启用警告的情况下进行编译?

我忽略了缺少缩进。

#include <stdio.h>
#include <string.h>
char find(char name[], char allNames[][10], int length)

什么?怎么样: char *name, **list, int size)

{
int i=0;

这里为什么设置为0?

for (i = 0; i < length; i++) {
if (strcmp(allNames[i],name) == 1) {
printf("%i",i);
return *name;

你读过 strcmp 的联机帮助页了吗?它 returns ZERO 当字符串匹配时,所以这段代码没有意义。

*name 是 char 类型,但您不想 return 一个 char。你想要 return 一个指针,不是吗?

}
}
return -1;

好吧,假设您在 printf 中将其输入 %s,您希望这里发生什么?通常一个人会 return NULL.

}

main(){

这是过时的语法,我不知道你从哪里偷来的。使用 'int main(void)'.

  char allNames[][10] = {"cat","dog","frog","log","bog"};

通常人们只是 return 这样的带有 NULL 指针的数组,这样就可以迭代这些数组并且不需要传递任何关于大小的信息。

  char name[] = "log";

为什么不 char *name = "log".

int length=5;

不正确。它对 allNames table 中存储的字符串数量进行硬编码。 printf("%s",find(名称,所有名称,长度));

}

这里 Segmentation Fault 的直接原因是因为代码试图用 %s 打印 char 类型(这需要一个地址值)。

void main()
{
 char c = 'a';
 printf("%s", c); // will cause Segmentation fault here
}

回到你的代码,也就是

char find(char name[], char allNames[][10], int length)//return char 
printf("%s",find(name,allNames,length));

使其工作的最小更改如下,

1) 至 return 字符*

char* find(char name[], char allNames[][10], int length)//return char*
{
  int i=0;
  for (i = 0; i < length; i++) {
    if (strcmp(allNames[i],name) == 0) { // here should 0
       printf("%i",i);
       return name; // change name* to name
    }
 }
  return NULL; // change to NULL
}
//to print
printf("%s",find(name,allNames,length));  

2) 到return位置值

    int find(char name[], char allNames[][10])
    {
       for (i = 0; i < 10; i++) {
          if (allNames[i] == name) {
          return i; // here, change to return i
       }
    }
    return -1;
    }

   //then, you can print like this
    printf("find at position: %d",find(name,allNames,length));
   //or to print string by 
    int pos = find(name,allNames,length);
    if(pos >= 0)
       printf("find the string: %s",allNames[pos]);