数组下标的类型int [int]无效

时间:2012-09-14 03:38:32

标签: c arrays error-handling

我正在尝试将一个二维数组传递给一个函数,但它始终抛出此错误。我的代码如下:

void initialize_centroids(int *,int,int);(Initialization)

initialize_centroids(centroid[0],noofcentroids,newnoofvar);(inside my main)

void initialize_centroids(int *carray,int p,int q)
{
    int i,j;
    for(i=0;i<p;i++)
    {
        for(j=0;j<q;j++)
        {
           carray[i][j]=i;
        }
    }

    return;
}

2 个答案:

答案 0 :(得分:1)

您正在传递指向int(int*)的指针,但您尝试使用两个下标。它是2D阵列吗?然后参数需要是指向int的指针的指针:int**

void initialize_centroids(int**, int, int);

int centroid[][] = ....  // wherever this comes from
initialize_centroids(centroid, noofcentroids, newnoofvar);(inside my main)



void initialize_centroids(int** carray, int p, int q)
{
    int i,j;
    for(i=0;i<p;i++)
    {
        for(j=0;j<q;j++)
        {
            carray[i][j]=i;
        }
    }

    return;
}

答案 1 :(得分:1)

传入时不要取消引用centroid。这样做只会通过你的第一行。这样做:

initialize_centroids( centroid, noofcentroids, newnoofvar );

然后你需要在这里使用正确的类型:

void initialize_centroids( int **carray, int p, int q )

您的数组可能是int**。这意味着它是一个指向内存中包含int*指针数组的位置的指针。这些指针中的每一个(我假设)都引用了已分配一行数组的内存。

现在,一旦您通过carray[i]获得其中一个指针,您就选择了行i。您现在有一个int*,这意味着它指向一个int数组。

最后,carray[i][j]从第j行的i列中选择一个特定的整数。

[编辑]

关于可能出现问题的理论......你可能不会在动态意义上分配2D数组,或者实际上它可能是一维数组而你应该使用步长等。这是一个解决方案,您可以使用它来动态分配2D数组,并将其编入索引为carray[i][j]

注意:由于对齐问题,有些人过去对我这种方法感到不满,但我从未遇到过问题。我想他们只是脾气暴躁的一天。对于那些担心对齐的人来说,很容易对此进行调整,但对于这个例子来说太复杂了。

int** allocate_array2d( int rows, int cols )
{
    int i, **arr, *data;
    arr = (int**)malloc( rows * sizeof(int*) + rows*cols*sizeof(int) );
    data = (int*)(arr + rows);
    for( i = 0; i < rows; i++ ) {
        rows[i] = data;
        data += cols;
    }
    return arr;
}

void free_array2d( int** arr ) {
    free((void*)arr);
}

现在,在你的主要:

int** centroid = allocate_array2d( noofcentroids, newnoofvar );
initialize_centroids( centroid, noofcentroids, newnoofvar );

[更多...]

  

好的。是的,我分配了像这个质心[100] [100]的记忆--Bobby 11   分钟前

在这种情况下,您应该声明:

void initialize_centroids( int carray[100][100], int p, int q )
{
    //...
}

无需使用我的动态数组示例