我有一个我想在其中初始化二维数组的c程序。 所以我做了这个功能:
void initLayer(int **layer, int *dimensions) {
printf("initLayer\n");
layer = malloc(sizeof(int*) * dimensions[0]);
for (int i = 0; i < dimensions[0]; i++) {
layer[i] = malloc(sizeof(int) * dimensions[1]);
}
}
使用此功能没有问题,但是稍后尝试读取2D数组时,总是会遇到分割错误。 我认为可能是因为函数完成时未保存初始化。 您知道我该如何纠正我的功能吗?预先谢谢你。
答案 0 :(得分:2)
要将指针传递给函数,您还需要一个指针。
int **matrix;
是一个数组数组,因此要填充它,您需要将其作为指针int ***layer
传递。但这很奇怪。
同样,要通过指针更改数据,您需要在其前添加星号*
。 *layer = ...
#include <stdlib.h>
void initLayer(int ***layer, int *dimensions)
{
*layer = malloc(sizeof(int *) * dimensions[0]);
for (int i = 0; i < dimensions[0]; i++)
{
*(*layer + i) = malloc(sizeof(int) * dimensions[1]);
}
}
int main()
{
int **matrix;
int dimensions[2] = { 4, 6 };
initLayer(&matrix, dimensions);
// then do whatever you want
for (int i = 0; i < dimensions[0]; i++)
{
for (int j = 0; j < dimensions[1]; j++)
{
matrix[i][j] = i * j;
}
}
}
对我来说,最好使用typedef
使代码更具可读性:
#include <stdlib.h>
typedef int * Array;
typedef int ** Matrix;
void initLayer(Matrix *layer, Array dimensions)
{
*layer = malloc(sizeof(Array) * dimensions[0]);
for (int i = 0; i < dimensions[0]; i++)
{
(*layer)[i] = malloc(sizeof(int) * dimensions[1]);
}
}
int main()
{
Matrix matrix;
int dimensions[2] = { 4, 6 };
initLayer(&matrix, dimensions);
// then do whatever you want
for (int i = 0; i < dimensions[0]; i++)
{
for (int j = 0; j < dimensions[1]; j++)
{
matrix[i][j] = i * j;
}
}
}
答案 1 :(得分:1)
调用函数时,将复制int **layer
指针。因此,当您执行layer = malloc(...)
时,该函数实际上将其本地副本设置为malloc
的结果。您想要的是对调用该函数的变量进行突变。您可以通过使用int ***layer
并在调用&layer
时传递initLayer
来实现。请注意,然后必须在代码中使用*layer
而不是layer
。
答案 2 :(得分:1)
您在这里有两种方法:
***int
)在第一种情况下:
void initLayer(int ***layer, int *dimensions) {
printf("initLayer\n");
*layer = malloc(sizeof(int*) * dimensions[0]);
for (int i = 0; i < dimensions[0]; i++) {
layer[i] = malloc(sizeof(int) * dimensions[1]);
}
}
您传递对指针的引用,而不传递(未初始化的)指针。请记住,在C语言中,所有参数均按值传递。在这种情况下,您可以将函数调用为:
...
int**vector;
...
initLayer(&vector, dims); /* you pass the address of your double pointer */
在第二种情况下:
int** initLayer(int *dimensions) {
printf("initLayer\n");
int **layer = malloc(sizeof(int*) * dimensions[0]);
for (int i = 0; i < dimensions[0]; i++) {
layer[i] = malloc(sizeof(int) * dimensions[1]);
}
return layer;
}
在这种情况下,您将其称为:
...
int**vector;
...
vector = initLayer(dims); /* you receive your double pointer as a return value */