【问题标题】:Why am I getting a segmentation fault here (C)为什么我在这里遇到分段错误 (C)
【发布时间】:2013-11-16 00:32:54
【问题描述】:

在线数组[j]=array[j]+1 中不断出现分段错误。 我已经包含了用于调用“模式”的主要功能部分,这是我遇到问题的功能。该程序应该以字符串的形式接受用户输入。根据字符串所说的,函数会做不同的事情。对于输入“模式”,它从用户那里获取一个数组,然后找到最常出现的模式或数字。该程序可能不是最干净或最有效的,但我只需要它工作。感谢您的帮助。

int mode(int input[]){
int array[30]={0},i=0,j=0,i2=0,j2=0;

while (input[i]!='\0'){
    j=input[i];
    array[j]=array[j]+1;
    i++;
    }

while (array[i2]!='\0'){
    if (array[i2]>j2){
        j2=array[i2];
        i2++;
    }
    else{
    i2++;
    }
}
return j2;
}


int main(){
char function_called[7];
int nums_for_mode[50],num_for_primes;
int num1,den1,num2,den2;


printf("Please choose a function (mode, primes, or fradd): ");
scanf("%s",&function_called);

if(strcmp(function_called, "mode")==0){
printf("\nPlease provide numbers between 1 and 30: ");
scanf("%i",&nums_for_mode);
printf("\nThe mode is %i\n",mode(nums_for_mode));
}

【问题讨论】:

  • 无关:您认为需要多少个char 元素来保存字符串“primes”?提示:它超过 6个。
  • scanf("%i",&nums_for_mode) 看起来很可疑。您将整数扫描到地址到地址到 int

标签: c arrays segmentation-fault


【解决方案1】:

nums_for_mode 未初始化,你也不要终止它。

在 main 顶部附近,将 nums_form_mode 的每个成员设置为 0:

    for(int a = 0; a < 50; a++)
            nums_for_mode[a] = 0;

或者,在声明点使用 ={0} 对其进行初始化。修复此问题将停止您的段错误,但程序仍然错误:

  • 您还应该循环获取数字,目前,您的程序实际上只接收一个数字。

  • array[30] 会很容易溢出,包括如果你输入 30。你应该至少让它长一个,并且在读取它时还要检查输入是否真的在范围内。

  • function_call的缓冲区太小容易溢出,在scanf的调用中应该限制输入的大小。

  • 这一行:while (array[i2]!='\0') 没有多大逻辑意义,它会提前终止而不实际检查输入。

【讨论】:

  • 非常感谢您的帮助。我现在正在努力。我正在上我的第一门编程课程,所以我犯了很多小错误。再次感谢您的帮助!
  • 那么为什么 while (array[i2]!='\0') 不起作用,我将如何终止循环?
  • 那是检查值,你应该计算长度。由于该数组有 30 个项目长,您应该通过 for(int place = 0; place &lt; 30; place++) { /* check array[place] */ 检查所有 30 个项目并返回您在其中找到的最大值。