在 C 语言中使用数组时"Error Segmentation fault (core dumped)"



我有这个代码,它运行得很好,除非我的输入是数字"2"

我不知道为什么,代码似乎还可以。。。有什么问题吗?

void initValue(int *a, int dim, int value, int i);
int findValue(int *a, int dim, int value, int i);
main(){
    int i, value, dim = 5;
    int a[dim];
    initValue(a, dim, value, i);
    printf("nYour values are: ");
    for(i = 0; i < dim; i++) printf("%d ", a[i]);
    printf("nn");
}
void initValue(int *a, int dim, int value, int i){
    printf("Insert your values:n");
    for(i = 0; i < dim; i++){
        scanf("%d", &value);
        if(findValue(a, dim, value, i) == 1){
            printf("This value already exist, please insert a new one.n");
            i--;
        }
        else a[i] = value;
    }
}
int findValue(int *a, int dim, int value, int i){
    int j, result = 0;
    for(j = 0; j < i || a[j] != value; j++) if(a[j] == value) result = 1;
    return result;
}

代码中的错误是以下行中的逻辑错误:

for(j = 0; j < i || a[j] != value; j++) if(a[j] == value) result = 1;

假设你有dim=5i=2value=10,不存在a。循环不会在j=2处停止,因为a[j] != value为真。之后,您将进入未定义的行为领域。

该行需要更改为:

for(j = 0; j < i ; j++) if(a[j] == value) return 1;

该功能现在可以简化为:

int findValue(int *a, int dim, int value, int i){
   int j = 0;
   for(j = 0; j < i ; j++)
   {
      if(a[j] == value)
      {
         result = 1;
      }
   }
   return 0;
}
  1. 你必须检查scanf()是否成功,类似

    if (scanf("%d", &value) != 1)
        maybeRemoveAllWhitespacesAndScanfAgain_MaybeReturnWithAnError();
    
  2. 您递减i并且从不检查i < 0

    for(i = 0; (i < dim) && (i >= 0) ; i++){
    
  3. initValue()可以定义为

    void initValue(int *a, int dim)
    {
        int value;
        int i;
        .
        .
        .
    }
    

传递来自CCD_ 11的变量是没有意义的。

另外,如果在scanf()之前初始化value,则可以防止在未初始化时尝试访问它。

相关内容

  • 没有找到相关文章

最新更新