我正在尝试编写一个具有动态行和列(多维(的数组。
这是我尝试过的:
#include <stdio.h>
#include <stdlib.h>
#define LEN(arr) ((int) (sizeof (arr) / sizeof (arr)[0]))
int main() {
int size, q = 0;
// get arr size from stdin
scanf("%d", &size);
int *arr[size];
for (int i=0; i<size; i++) {
int len, element = 0;
// get length of column from stdin
scanf("%d", &len);
arr[i] = malloc(len * sizeof(int));
for(int j=0; j<len; j++) {
// get each column's element from stdin and append to arr
scanf("%d", &element);
arr[i][j] = element;
}
}
for (int i=0; i< LEN(arr); i++)
printf("%dn", LEN(arr[i]));
}
标准丁:
2
3 4 5 6
4 1 2 3 4
输入的第一行是要存储在arr(2(中的数组的大小/数量, 以下行以列的大小 (3, 4( 开头,后跟要在每列中存储的元素 (4 5 6, 1 2 3 4(。
标准输出:
2
2
当我运行这个程序时,输出为 2,这意味着每列的长度为 2,这是无意的。我正在寻找一种解决方案来输出正确的列长。我做错了什么?
预期的标准是:
3
4
arr
是一个数组,因此sizeof(arr)
会按预期为您提供数组的大小(以字节为单位(。
但是,arr[i]
不是一个数组。 它是一个指针,特别是一个int *
。 因此,sizeof(arr[i])
为您提供了int *
的大小(以字节为单位(。
动态分配内存时,需要跟踪分配的空间量。 您可以通过维护一个单独的数组来执行此操作,该数组的大小为每个子数组的大小。
int *arr[size], arr_len[size];
...
for (int i=0; i<size; i++) {
...
arr[i] = malloc(len * sizeof(int));
arr_len[i] = len;
...
}
for (int i=0; i< LEN(arr); i++)
printf("%dn", arr_len[i]));