如何将指针数组作为函数的参数提供?
在下面的代码中,如果我希望我的函数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[])
,而我认为可以声明一个指针数组而不指定数组的长度。
答案 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);