编辑:我不应该使用[].
我已经定义了一个值为5的整数N和*malloc。
#define N
void* malloc (size_t size);
…
int *p_mat=(int*)malloc(sizeof(int*) * N);
这是矩阵。
现在我们需要数组
int p_arr1=(int)malloc(sizeof(int) * 4);
int p_arr2=(int)malloc(sizeof(int) * 3);
int p_arr3=(int)malloc(sizeof(int) * 1);
int p_arr4=(int)malloc(sizeof(int) * 2);
int p_arr5=(int)malloc(sizeof(int) * 5);
我们有5个不同大小的数组。现在我如何让矩阵的每个指针指向数组中的第一个单元格?
另一个问题,我如何将这些变量发送给函数,我的意思是-函数键中的参数是什么?
一个包含N个指针的数组,指向不同大小的整数数组....(注意在C语言中不强制转换malloc返回值-可以隐藏错误-参见我是否强制转换malloc的结果?)
int i = 0;
int *p[N];
size_t sizes[] = { 4, 3, ..., 5 }; // N sizes
for(; i < N; ++i)
{
p[i] = malloc(sizeof(int) * sizes[i]);
}
现在p
是一个指向整型的指针数组。因此,p[n]
是数组中第n个指向整型的指针。
int *p[n]
在内存中看起来像这样:
int *p[n]
+-----+
| | <------- Each element of the array is a pointer-to-an-integer
| |
+-----+
| |
| |
+-----+
.
.
.
+-----+
| |
| |
+-----+
当我们执行p[n] = malloc(sizeof(int) * sizes[i])
时,我们说指针p[n]
(记住数组p
的每个元素都是指针)指向sizes[i]
整数大小的内存块。所以你会得到像…
+-----+ +------+------+ ... +------+
|p[n] |-------- array element is a pointer to ---> | int1 | int2 | | intm |
| | | | | | |
+-----+ +------+------+ ... +------+
.
.
.
+-----+
| |
| |
+-----+
所以当你写p[n]
的时候你是在访问一个指向整型数组的指针malloc()
ed。
之后在你的代码中,你必须记住free()
分配的内存:)
for(; i < N; ++i)
{
free(p[i]);
}
编辑:我没有读到你问题的最后一点,但是wilsonmichaelpatrick已经回答了…
编辑:注意,顺便说一句,我没有检查malloc()
返回NULL
和处理可能的错误a这只是一个例子…
如果您不想在堆栈上声明int *p[N];
,而希望在堆上声明,请尝试以下操作:
int i = 0;
size_t sizes[] = { 4, 3, ..., 5 }; // N sizes
int **p = malloc(sizeof(int *) * N);
for(; i < N; ++i)
{
p[i] = malloc( sizeof(int) * sizes[i]);
}
...
...
for(; i < N; ++i)
{
free(p[i]);
}
free(p);
编辑:使用#include <stdlib.h>
来定义free()
和malloc()
编辑:首先,让我们从一些更正开始:
int **p_mat=(int**)malloc(sizeof(int*) * N);
int *p_arr1=(int*)malloc(sizeof(int) * 4);
int *p_arr2=(int*)malloc(sizeof(int) * 3);
int *p_arr3=(int*)malloc(sizeof(int) * 1);
int *p_arr4=(int*)malloc(sizeof(int) * 2);
int *p_arr5=(int*)malloc(sizeof(int) * 5);
现在,您可以使矩阵的每个元素都指向数组的第一个元素,如下所示:
p_mat[0] = p_arr1;
p_mat[1] = p_arr2;
p_mat[2] = p_arr3;
p_mat[3] = p_arr4;
p_mat[4] = p_arr5;
如果你想把它传递给一个函数,你可以直接输入
int SomeFunction(int **theMatrix)
{
/* Get third element of second row */
int nSecondElementFirstRow = theMatrix[1][2]; /* same as p_arr2[2] above */
}
和
SomeFunction(p_mat);
具体到你的评论,你可以有一个函数:
void print_number(int n)
{
printf("%dn", n);
}
,并像这样命名:
print_number(p_mat[1][2]);
输出第二行第三个元素;这将打印出p_arr2[2]。您可以在malloc p_arr2之后设置p_arr2[2] = 12345;
。
最后,我刚刚读到的许多评论建议不要像我那样强制转换malloc的结果:
如果要将每个数组与第一个数组关联:
p_mat[0] = p_arr1;
p_mat[1] = p_arr2;
//(...)
p_mat[4] = p_arr5;