将数组作为参数并读取其值

时间:2016-01-15 19:08:26

标签: c arrays

我正在使用函数扫描值。

int **array(int * counter) {
    int **vrat;
    int max = 5; 
    int index = 0;
    int i;
    vrat = malloc(max*sizeof(int*));
    for ( i = 0; i < max ; i++) {
        vrat[i] = malloc(2 * sizeof(int));
    }
    int x;
    int y;
    char c;
    while (scanf("%d%c%d", &x, &c, &y) != EOF) {
        vrat[index][0] = x;
        vrat[index][1] = y;
        index++;
    }
    *counter = index;
    return vrat;
}

并在main中调用它以返回有效的数组。

int main()
{
    int counter=0;
    int **mej;
    int gg;
    mej = array(&counter);
    int i;
    gg = pocet(mej, &counter);

    return 0;
}
什么困扰我的朋友&#34; pocet&#34;函数,我在其中传递一个数组,并希望打印其值。但它总是打印未定义的数字 功能看起来像这样

int pocet(int array[][2],int *counter) {
    int poc = 0;
    int i;
    for ( i =0; i < *counter ;i++) {
          printf("cislo = %d", array[i][0]);    
    }
    return poc;
}

正如你所看到的,它有静态的第二维,我怎样才能使这个工作?

4 个答案:

答案 0 :(得分:3)

  1. 您正在为5指针分配空间,您应该乘以指针的大小而不是int的大小,就像这样

    vrat = malloc(max * sizeof(int *));
    /*                             ^ pointer */
    

    虽然你可以通过乘以像

    这样的指针类型的大小来完全避免错误
    vrat = malloc(max * sizeof(*vrat));
    

    并且在实际使用指针之前始终检查malloc()是否未返回NULL

  2. 此外,请勿将scanf()EOF进行比较,因为它在输入错误之前不太可能获得EOF,因为它需要显式输入来自用户,而不是这样做

    while(scanf("%d%c%d", &x, &c, &y) == 3)
    
  3. 函数的返回类型应与返回的对象的返回类型匹配,在本例中为int **,将函数签名更改为

    int **array(int *content)
    

答案 1 :(得分:1)

  1. vrat = malloc(max*sizeof(int*));

    您如何知道内存是否已成功分配?

    始终检查malloc & family函数返回的指针是否与NULL等效,以避免可能SegFault

    1. while (scanf("%d%c%d", &x, &c, &y) != EOF)

      如果c匹配失败怎么办?然后,scanf将返回1while仍然会进行迭代,即使scanf无法在cy中存储值。

      所以请始终将scanf返回值与否进行比较。参数而不是EOF

      1. while (scanf("%d%c%d", &x, &c, &y) != EOF) {
            vrat[index][0] = x;
            vrat[index][1] = y;
            index++;
        }  
        

        如果index >= max怎么办?

        由于您只为max整数指针分配了内存,因此不得尝试访问分配块之外的内存。

        解决方案:将while条件更改为

        while ((scanf("%d%c%d", &x, &c, &y) == 3) && (index < max))
        
      2. 所以正确的代码片段是:

        vrat = malloc(max*sizeof(int*));
        if(!vrat)
        {
            printf("vrat: malloc failed!\n");
            exit(1);
        }
        
        for ( i = 0; i < max ; i++) {
            vrat[i] = malloc(2 * sizeof(int));
            if(!vrat[i])
            {
                printf("vrat[%d]: malloc failed!\n", i);
                exit(1);
            }
        }
        
        int x;
        int y;
        char c;
        while ((scanf("%d%c%d", &x, &c, &y) == 3) && (index < max)) {
            vrat[index][0] = x;
            vrat[index][1] = y;
            index++;
        }
        

答案 2 :(得分:1)

int**不是int[][2]。第一个是指向int的指针,而第二个(作为参数)是指向int[2]的指针。你不能像你尝试的那样在两者之间进行转换。你应该得到一个编译器警告/错误。

解决此问题的最简单方法是让pocetint**作为第一个参数。解决其他人提到的问题。

答案 3 :(得分:0)

您已定义int **vrat; 当你做malloc时,你需要使用int **int *而不是int