提问人:Aryan Maheshwari 提问时间:3/23/2023 更新时间:3/23/2023 访问量:53
动态分配大小为 10 的 2d char 数组,并使用 sizeof 运算符获取其正确大小(即 10)
Dynamically allocate 2d char array of size 10 and get its correct size (i.e 10) using sizeof operator
问:
我的要求是在 C 语言中分配一个 2d char 数组,假设大小为 10,这样如果我以后想获得它的大小,我应该得到 10 作为答案。
但是我被 2 种方法困住了,这两种方法都有一些问题。.
方法 1(获取实际大小/行数时出现问题)
char **arr = NULL;
arr = (char **)malloc(sizeof(char *) * 10);
int sz = sizeof(arr) / sizeof(arr[0]); //expected 10, but gives 8 (that is size of char ptr(8) / sizeof char (1))
方法 2(不知道 malloc 对此)
char *arr[] = {};
//malloc to allocate 10 rows
int sz = sizeof(arr) / sizeof(arr[0]); // gives 10 correctly
答:
4赞
0___________
3/23/2023
#1
char **arr = NULL;
不是二维数组,只是指向指向 char 的指针的指针。 在指针到指针上的工作方式与将其用于“正常”数组获取其大小的方式不同。sizeof
动态分配数组时,需要自己记住数组的大小。 在这种情况下将不起作用。sizeof
如何分配真正的二维阵列?您需要使用指向数组的指针。
size_t rows = 10;
size_t columns = 20;
char (*Array2D)[columns] = malloc(rows * sizeof(*Array2D));
评论
0赞
chqrlie
3/23/2023
我不清楚 OP 是否意味着动态分配或只是定义,例如其计算结果为 .char array[2][5]
size(array)
10
0赞
chux - Reinstate Monica
3/23/2023
Array2D
也不是 2D 数组。 是一个指针,一个指向一维数组的指针。Array2D
0赞
Aryan Maheshwari
3/23/2023
因此,“rows”值无法事先进行硬编码/已知。它将从用户输入中接收,并基于该分配 2D 字符数组。柱子可以事先固定。
1赞
Eric Postpischil
3/23/2023
#2
下面的代码执行您请求的操作,但不是您可能实际想要的操作。特别是,指针不能以普通方式传出例程。
#include <stdio.h>
#include <stdlib.h>
void foo(size_t n)
{
int (*p)[n] = malloc(sizeof *p);
if (!p)
{
fprintf(stderr, "Error, malloc failed.\n");
exit(EXIT_FAILURE);
}
printf("*p has %zu elements.\n", sizeof *p / sizeof **p);
}
int main(void)
{
foo(3);
foo(10);
}
它之所以有效,是因为虽然我们必须将结果分配给指针,而不是数组,但它可以是指向数组类型的指针,并且该类型可能是可变长度的数组类型。malloc
评论
but gives 8 (that is size of char ptr(8) / sizeof char (1))
是错误的。 给出 1.char **arr = NULL; ... int sz = sizeof(arr) / sizeof(arr[0]);
char (*b)[3][5] = malloc(sizeof *b);
-->sizeof *b
是 15 岁。 是指向二维数组的指针。b