动态分配大小为 10 的 2d char 数组,并使用 sizeof 运算符获取其正确大小(即 10)

Dynamically allocate 2d char array of size 10 and get its correct size (i.e 10) using sizeof operator

提问人:Aryan Maheshwari 提问时间:3/23/2023 更新时间:3/23/2023 访问量:53

问:

我的要求是在 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
数组 c char malloc sizeof

评论

1赞 Eugene Sh. 3/23/2023
保存用于分配的大小,并在以后检索它。没有别的办法。
0赞 Brian61354270 3/23/2023
顺便说一句,您可能有兴趣阅读 我投射了 malloc 的结果吗?
0赞 chux - Reinstate Monica 3/23/2023
but gives 8 (that is size of char ptr(8) / sizeof char (1))是错误的。 给出 1.char **arr = NULL; ... int sz = sizeof(arr) / sizeof(arr[0]);
0赞 Aryan Maheshwari 3/23/2023
是的给 1 而不是 8,我的错误..但我想得到值 10 作为答案。你能为第二种方法提供 malloc 命令吗?
0赞 chux - Reinstate Monica 3/23/2023
char (*b)[3][5] = malloc(sizeof *b); --> sizeof *b是 15 岁。 是指向二维数组的指针b

答:

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