我已经编写了一段代码,但我不确定它是如何工作的。 我想创建一个指针数组并将其作为参数传递给函数,如下所示:
int main()
{
int *array[10] = {0};
for(int i = 0; i < 3; i++)
{
array[i] = (int *)malloc(3*sizeof(int *));
}
testFunction(array);
for(int i = 0; i < 3; i++)
{
free(array[i]);
}
return 0;
}
void testFunction(int *array[3])
{
//do something
return;
}
我不明白以下内容。我将array
声明为指针数组,使用malloc
为其分配内存,然后继续调用testFunction
。我想通过引用传递数组,并且我理解当我使用testFunction(array)
调用该函数时,数组会衰减到指向其第一个元素的指针(也将是一个指针)。但为什么在参数列表中我必须用(int *array[3])
编写*
而不只是(int array[3])
?
答案 0 :(得分:1)
type *
的参数可以接受type []
的参数,但不能接受type
中的任何参数。
如果你写void testFunction(int arg[3])
它很好,但你无法访问array[1]
和array[2]
等等,只有前3个元素array[0]
指向的地方。还需要修改(使用testFunction((int*)array);
调用。
作为一种好的做法,必须使函数参数与作为参数传递的内容一致。因此int *array[10]
可以传递给f(int **arg)
或f(int *arg[])
,但 f(int *arg)
或 f(int arg[])
。
答案 1 :(得分:0)
void testFunction(int **array, int int_arr_size, int size_of_array_of_pointers)
{
for(int j = 0; j < size_of_array_of_pointers; j++)
{
int *arrptr = array[j]; // this pointer only to understand the idea.
for(int i = 0; i < int_arr_size; i++)
{
arrptr[i] = i + 1;
}
}
}
和
int main()
{
int *array[10];
for(int i = 0; i < sizeof(array) / sizeof(int *); i++)
{
array[i] = malloc(3*sizeof(int));
}
testFunction(array, 3, sizeof(array) / sizeof(int *));
for(int i = 0; i < sizeof(array) / sizeof(int *); i++)
{
free(array[i]);
}
return 0;
}
答案 2 :(得分:-1)
Evering取决于warning: ISO C++ forbids zero-size array 'cstr' [-Wpedantic]
在您的情况下的含义。
让我们从简单开始:也许,你只需要整数数组
如果您的函数仅更改数组中的值但不更改大小,则可以将其作为// do something
或int *array
传递。
int array[3]
只允许使用大小为int *array[3]
的数组,但如果您可以使用3
选项int
的任何数组,则需要额外的参数int *array
:
int size
下一步:如果需要指针数组
参数应为void testFunction(int *array, int arr_size)
{
int i;
for(i = 0; i < arr_size; i++)
{
array[i] = i + 1;
}
return;
}
或更好int *array[3]
(指针指针)。
查看初始化循环(我将int **array
更改为sizeof(int *)
)
sizeof(int)
我想你需要二维数组,所以你可以传递for(int i = 0; i < 3; i++)
{
array[i] = (int *)malloc(3*sizeof(int));
}
但是大小为二维或一个大小的矩形(高度等于宽度):
int **array
最后:2D阵列的内存分配
考虑void testFunction(int **array, int wSize, int hSize)
{
int row, col;
for(row = 0; row < hSize; row++)
{
for(col = 0; col < wSize; col++)
{
array[row][col] = row * col;
}
}
}
的以下变体:
main
请注意,int main()
{
int **array;
// allocate memory for 3 pointers int*
array = (int *)malloc(3*sizeof(int *));
if(array == NULL)
return 1; // stop the program
// then init these 3 pointers with addreses for 3 int
for(int i = 0; i < 3; i++)
{
array[i] = (int *)malloc(3*sizeof(int));
if(array[i] == NULL) return 1;
}
testFunction(array, 3, 3);
// First, free memory allocated for int
for(int i = 0; i < 3; i++)
{
free(array[i]);
}
// then free memory allocated for pointers
free(array);
return 0;
}
返回的值应在使用前检查(NULL表示未分配内存)。
出于同样的原因,可以在函数内添加检查:
malloc