malloc矩阵,指向malloc数组(C)



编辑:我不应该使用[].

我已经定义了一个值为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;

相关内容

  • 没有找到相关文章

最新更新