2015-02-10 53 views
0

我有这个代码,它工作得很好除了当我的输入是数字“2”“错误分段错误(核心转储)”,而在数组中使用C

我不知道为什么,代码似乎没问题... 有什么问题吗?

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

编译所有的警告和调试信息('GCC -Wall -Wextra -g' )。然后**使用调试器**('gdb')。阅读关于[未定义的行为](http://en.wikipedia.org/wiki/Undefined_behavior) – 2015-02-10 20:39:10

+2

除了'int * a'和'int dim'外,我发现从main()传递变量没有意义,为什么你在做那个吗?另外,你的意见是什么? – 2015-02-10 20:42:05

+0

@iharob我的教授给了我这个练习:( – 2015-02-10 20:48:26

回答

2

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

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

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

这行需要更改为:

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 < 0

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

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

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

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

+0

是的,那是一个愚蠢的错误:) – 2015-02-10 20:51:15