-1

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

我已经定义了值为 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个不同大小的数组。现在如何使矩阵的每个指针指向数组中的第一个单元格?

还有一个问题,我如何将这些变量发送到函数,我的意思是 - 函数键中的参数是什么?

4

3 回答 3

3

一个指向不同大小的整数数组的 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是一个指向 int 的指针数组。p[n]因此是数组中的第 n 个指向 int 的指针。

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()编辑的整数数组的指针......

稍后在您的代码中,您必须记住free()分配的内存:)

for(; i < N; ++i)
{
    free(p[i]);
}

希望这可以帮助...

编辑:没有阅读你问题的最后一点,但 wilsonmichaelpatrick 已经回答了......

编辑:注意,顺便说一句,我没有检查malloc()返回NULL和处理可能的错误,这只是一个例子......

如果您不想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()

于 2013-05-14T12:55:48.597 回答
2

编辑:首先,让我们从一些更正开始:

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("%d\n", n);
}

并这样称呼它:

 print_number(p_mat[1][2]);

打印出第二行的第三个元素;这将打印出 p_arr2[2]。您可以p_arr2[2] = 12345;在 malloc p_arr2 进行测试后立即设置。

最后,我刚刚阅读的许多评论建议不要像我所做的那样强制转换 malloc 的结果:我是否强制转换 malloc 的结果?

于 2013-05-14T12:55:34.823 回答
1

如果要将每个数组与第一个数组关联:

p_mat[0] = p_arr1;
p_mat[1] = p_arr2;
//(...)
p_mat[4] = p_arr5;
于 2013-05-14T12:52:40.317 回答