作为函数参数的指针数组

时间:2014-08-14 13:06:17

标签: c arrays pointers

如何将指针数组作为函数的参数提供?

在下面的代码中,如果我希望我的函数f采用指针数组int *x[],我应该如何在main()中声明x并将其作为参数提供给f?

void f(int *x[]){ 
     int data[5] = {1,2,3,4,5};
     int k;
     for(k=0; k<5; k++){ 
        x[k] = &(data[k]);
     }
}

int main(){
    int *(x[]), k, l=5;
    f(x); // this does not work
    for(k=0; k<l; k++){ 
        printf("x[%d] = %d\n", k, *x[k]);
        }
    }
    return 0;
}

撰写f(x)不起作用,f(x[])f(x[5])也不起作用。

事实上,我的编译器已经无法识别声明int *(x[]),而我认为可以声明一个指针数组而不指定数组的长度。

3 个答案:

答案 0 :(得分:2)

main中,更改

int *(x[])  

int *x[SIZE]; // SIZE is array size    

请注意,除非是结构的最后一个成员,否则不能在C中声明零大小的数组。

毕竟,您的代码将调用未定义的行为,因为变量data是一个自动局部变量,在函数返回后将不存在。

你可能想要这个:

void f(int *x[]){ 
     int *data = malloc(5*sizeof(int);
     int temp[5] = {1,2,3,4,5};
     memcpy(data, temp, 5*sizeof(int));
     int k;
     for(k=0; k<5; k++){ 
         x[k] = &(data[k]);
     }
} 

答案 1 :(得分:1)

首先,您的代码没有意义,因为您正在尝试填充指向局部变量的指针数组。这是在exiti8ng函数之后,所有指针都将无效,因为原始对象将被销毁。 如果函数中的数组具有静态存储持续时间

,则代码可能有意义
void f(int *x[]){ 
     static int data[5] = {1,2,3,4,5};
     int k;
     for(k=0; k<5; k++){ 
        x[k] = &(data[k]);
     }
}

在主阵列中,x应至少定义为

int * x[5];


int main(){
    int * x[5], k;

    f(x); 

    for ( k=0; k < 5; k++ ){ 
        printf("x[%d] = %d\n", k, *x[k]);
        }
    }
    return 0;
}

答案 2 :(得分:0)

将指针数组声明为参数的另一种方法是使用指针

的指针
void f(int **x, int size){ 
  //code
}

但是,如果你想避免溢出,你必须将大小作为第二个参数传递。

要调用代码,您只需执行以下操作:

int *a[] = { NULL, NULL, NULL};
f(a, 3);