我正在尝试通过动态分配来构建二维数组。我的问题是它的第一个维度是否有可能取 100 个值,然后第二个维度会根据我的问题取可变数量的值?如果有可能,那么我将如何访问它?我怎么知道第二维的边界?
问问题
22533 次
4 回答
5
(见代码中的注释)
结果,您将获得如下所示的数组:
// Create an array that will contain required variables of the required values
// which will help you to make each row of it's own lenght.
arrOfLengthOfRows[NUMBER_OF_ROWS] = {value_1, value_2, ..., value_theLast};
int **array;
array = malloc(N * sizeof(int *)); // `N` is the number of rows, as on the pic.
/*
if(array == NULL) {
printf("There is not enough memory.\n");
exit (EXIT_FAILURE);
}
*/
// Here we make each row of it's own, individual length.
for(i = 0; i < N; i++) {
array[i] = malloc(arrOfLengthOfRows[i] * sizeof(int));
/*
if(array[i] == NULL) {
printf("There is not enough memory.\n");
exit (EXIT_FAILURE);
}
*/
}
于 2013-11-12T03:51:27.847 回答
2
您可以使用 100 个指针的数组:
int *arr[100];
然后你可以动态地为 100 个指针中的每一个分别分配你想要的任何大小的内存,但是你必须记住你分配了多少内存(对于每个指针),你不能指望 C 编译器记住它或告诉你它,即sizeof
在这里不起作用。
要访问任何(允许的,在边界内)位置,您可以简单地使用 2D 数组表示法,例如访问5th
分配给指针的内存位置,20th
您可以使用arr[20][5]
或*(arr[20] + 5)
.
于 2013-11-12T03:51:12.567 回答
1
使用单个指针:
int *arr = (int *)malloc(r * c * sizeof(int));
/* 如何访问数组元素 */
for (i = 0; i < r; i++)
for (j = 0; j < c; j++)
*(arr + i*c + j) = ++count; //count initialized as, int count=0;
使用指向指针的指针:
int **arr = (int **)malloc(r * sizeof(int *));
for (i=0; i<r; i++)
arr[i] = (int *)malloc(c * sizeof(int));
在这种情况下,您可以像访问静态分配的数组一样访问数组元素。
于 2017-08-23T02:52:14.740 回答
1
我相信 OP 想要为数组提供一块内存,并且愿意修复其中一个维度来获得它。在用 C 编码时,我也经常喜欢这样做。
我们过去都可以做double x[4][];
,编译器会知道该怎么做。但显然有人把这件事搞砸了——甚至可能是有充分理由的。
然而,以下仍然有效,允许我们使用大块内存,而不必进行大量指针管理。
#include <stdio.h>
#include <stdlib.h>
// double x[4][];
struct foo {
double y[4];
} * x;
void
main(int ac, char * av[])
{
double * dp;
int max_x = 10;
int i;
x = calloc(max_x, sizeof(struct foo));
x[0].y[0] = 0.23;
x[0].y[1] = 0.45;
x[9].y[0] = 1.23;
x[9].y[1] = 1.45;
dp = x[9].y;
for (i = 0; i < 4; i++)
if (dp[i] > 0)
printf("%f\n", dp[i]);
}
诀窍是在结构中声明固定维度。但请记住,“第一”维度是动态维度,“第二”维度是固定的。这与旧方式相反......
您将不得不自己跟踪动态维度的大小 - sizeof 无法帮助您。
使用匿名的东西你甚至可以摆脱'y'。
于 2015-10-19T20:58:35.263 回答