【问题标题】:"Error Segmentation fault (core dumped)" while working with Arrays in C使用 C 中的数组时出现“错误分段错误(核心转储)”
【发布时间】:2015-02-10 20:37:52
【问题描述】:

我有这段代码,它工作得很好除非我输入的是数字“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("\n\n");
}

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;
}

【问题讨论】:

  • 编译时包含所有警告和调试信息 (gcc -Wall -Wextra -g)。然后使用调试器 (gdb)。阅读undefined behavior
  • 除了int *a 和int dim 之外,我认为从main() 传递变量没有任何意义,你为什么要这样做?另外,您的意见是什么?
  • @iharob 我的教授给了我这个练习:(
  • @ArtjomB。好的,对不起xD

标签: c arrays pointers segmentation-fault


【解决方案1】:

你代码中的错误是这一行的逻辑错误:

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

假设您有dim=5 和i=2 和value=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;
}

【讨论】:

    【解决方案2】:
    1. 您必须检查 scanf() 是否成功,例如

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

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

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

    从main() 传递变量是没有意义的。

    还有一点,如果您在 scanf() 之前初始化 value,您可以防止在未初始化时尝试访问它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-19
      • 1970-01-01
      相关资源
      最近更新 更多