c语言 - 我不知道是什么导致了分段错误



我正在尝试创建一个简单的"日记",您可以在其中添加工人,然后写下他们工作了多少小时。但是每次我到达switch语句时,我都会得到一个分段错误。我不知道是什么原因造成的,我的知识还没有达到我自己可以找到它的水平。 代码:

include <stdio.h>
include <stdlib.h>
include <string.h>
int vybera(int pocet){
int vyber;
int i;
printf("nKtery zamestnanec?n");
for(i = 0; i < pocet; i++){
printf("%dn", i + 1);
}
scanf("%d", vyber);
return vyber;
}
int main(int argc, char** argv) {
int worker;
int pocet;
int i;
int vyber;
int pomoc;
int odprac = 0;
printf("Kolik zamestnancu chcete pridat: ");
scanf("%d%*c", &pocet);
char workforce[pocet][100];
printf("Zadejte %d jmen: n", pocet);
for(i = 0; i < pocet; i++){
gets(workforce[i]);
}
for(i = 0; i < pocet; i++){
printf("%sn", workforce[i]);
}
vyber = vybera(pocet);
switch(vyber){
case 1:
worker = vyber - 1;
printf("Vybrali jste %s.n", workforce[worker]);
printf("Pocet odprac. hodin: ");
scanf("%d", pomoc);
odprac += pomoc;
strcat(workforce[worker], (", %c", odprac + '0'));
break;
case 2:
worker = vyber - 1;
printf("Vybrali jste %s.n", workforce[worker]);
printf("Pocet odprac. hodin: ");
scanf("%d", pomoc);
odprac += pomoc;
strcat(workforce[worker], (", %c", odprac + '0'));
break;
case 3:
worker = vyber - 1;
printf("Vybrali jste %s.n", workforce[worker]);
printf("Pocet odprac. hodin: ");
scanf("%d", pomoc);
odprac += pomoc;
strcat(workforce[worker], (", %c", odprac + '0'));
break;
case 4:
worker = vyber - 1;
printf("Vybrali jste %s.n", workforce[worker]);
printf("Pocet odprac. hodin: ");
scanf("%d", pomoc);
odprac += pomoc;
strcat(workforce[worker], (", %c", odprac + '0'));
break;
case 5:
worker = vyber - 1;
printf("Vybrali jste %s.n", workforce[worker]);
printf("Pocet odprac. hodin: ");
scanf("%d", pomoc);
odprac += pomoc;
strcat(workforce[worker], (", %c", odprac + '0'));
break;
default:
printf("Spatny vyber.n");
}   
for(i = 0; i < pocet; i++){
printf("%sn", workforce[i]);
}
return (EXIT_SUCCESS);
}

我真的处于我的智慧尽头,需要我能得到的一切帮助。即使关于隔离错误主题有很多问题,我发布此内容的原因是他们都没有使用我的代码。我感谢任何帮助和您的耐心。 编辑:我来自捷克,因此为什么我的大部分变量和所有printf输出都是捷克语。仅供参考。

更改: scanf("%d",vyber); to scanf("%d", &vyber) 对 Pomoc 执行相同的操作;
说明:因为 vyber 变量是 int,所以你需要用"&"与号显式传递地址值,不像字符串(隐式传递其地址)。 分段错误表示您正在尝试访问不属于您的内存。 在这种情况下,维伯。

你已经被告知问题在哪里,但让我简要地提到你如何自己找到(下一个)问题。 基本上,(至少)有三种方法:

  1. 使用调试器逐行运行程序,直到它崩溃。 调试器还允许您停止程序并检查任何变量的值,以查看代码的实际操作。

    您还没有告诉我们您正在使用什么操作系统,编译器和IDE(如果有的话),所以我不能推荐任何特定的调试器(无论如何,这真的不是SO的主题),但几乎可以肯定有一个调试器可用于您的系统,无论它是什么。 学习如何使用调试器需要一点努力,但这绝对是值得的。


  1. 如果由于某种原因不能或不想使用调试器,则可以通过在代码中添加printf()语句来显示正在发生的事情,从而执行"穷人的调试"。 这样,你可以看到程序在崩溃之前走了多远,你还可以打印出变量的值,以便更好地了解发生了什么。

    我建议打印到标准错误流(带fprintf(stderr, "...")),因为它不会干扰程序的正常输出,并且每次打印到错误流时都会自动刷新,因此如果程序崩溃,缓冲输出不会丢失

    。一个有用的技巧是在这样的调试打印语句前面加上if (DEBUG),如下所示:

    if (DEBUG) fprintf(stderr, "This is an example of debugging output.n");
    

    然后,在程序的顶部,包含如下行:

    #define DEBUG 1
    

    这样,您可以通过将1更改为0来轻松关闭调试输出。 (还有一些更高级的方法可以在编译时更改定义,或者将 IDE 配置为根据构建目标进行更改,但这超出了答案的范围。


  1. 最后,您可以执行"平分调试"。 基本上,制作程序的副本(或者更好的是,将其提交到版本控制系统中)并开始删除部分代码,直到问题停止发生。 此时,您将知道问题与您删除的最后一段代码中的某些内容有关。 然后,您可以撤消最近的更改,并删除其他内容,并继续这样做,直到您将程序简化为最简单的示例,该示例仍然演示了问题。

    在这一点上,应该很容易看出问题是什么,因为你不再有任何不相关的代码来分散你的注意力。 或者,如果没有,至少你有一小段代码可以清楚地演示问题,并且可以将其发布在Stack Overflow上以寻求帮助。:)

scanf("%d", pomoc);

这是scanf()函数的语法不正确。它应该是:

scanf("%d", &pomoc);

同样的错误在输入语句中复制vyber

scanf("%d", &vyber)

发生这种情况是因为您尝试使用scanf()函数访问内存中的越界位置。由于你没有引用变量vyberpomoc,编译器试图访问存储在vyberpomoc中的变量的地址的内存点,而不是这些变量的内存位置。这进入了未定义的行为,这就是你得到一个段错误的原因。

相关内容

  • 没有找到相关文章