获取矩阵中的当前元素数以决定何时重新分配它

getting the current number of elements in a matrix to decide when to realloc it

我有一个矩阵,在程序启动后得到 calloced。然后我需要弄清楚何时需要重新分配它(在数组已满之后)。我最初的想法是在结构中保存一个计数器变量并在每次插入后递增它,但我认为使用 sizeof() 有更好的方法吗?我正在使用 calloc 所以我不需要结合使用 mallocmemset,这意味着得到 calloced 的索引将被设置为 0?所以我需要检查数组中有多少“非零”元素才能知道我什么时候必须 realloc。我写了一个简单的测试程序,但我对输出“1”的底部 printf 语句感到困惑。元素被放入这个数组后,它们不会以任何方式被修改,这就是为什么计数器方法对我来说似乎很好,但我想测试它是否有效。

#include <stdio.h>
#include <stdlib.h>

struct c {

    char** arr;
};

int main() {

    struct c a;

    a.arr = calloc(40, sizeof(char*));
    
    for (int x = 0; x < 40; ++x) {

        a.arr[x] = calloc(20, sizeof(char));

        a.arr[x] = "lol[=10=]";
    }

    a.arr[30] = "dfsd[=10=]";

    printf("%s\n", a.arr[30]);

    printf("reallocing...\n");

    a.arr = realloc(a.arr, 200 * sizeof(char*));


    if (a.arr == NULL) {

        printf("failed\n");
    }

    for (int x = 40; x < 200; ++x) {

        a.arr[x] = calloc(20, sizeof(char));

        a.arr[x] = "lol[=10=]";
    }


    for (int x = 0; x < 200; ++x) {

        printf("%s\n", a.arr[x]);

    }

    printf("total size: %i\n", sizeof(a.arr) / sizeof(a.arr[0]));
}

这不应该输出一个而是矩阵的大小,因为sizeof(a.arr[0])会给你char类型的大小,然后把它分成数组的大小以字节为单位。

sizeof(array)/sizeof(array[0]) 机制仅适用于原始声明范围内的固定大小的数组。它不能用于确定动态分配数组的大小,不能用于作为单个指针传递给函数的数组,存储等 - 即数组已经衰减为指针

您必须自己将尺寸存储在某个地方

sizeof 可用于报告 object.

的大小

*alloc() returns 指向已分配内存的指针。 sizeof 不能用于辨别从返回的指针分配的数量。跟踪使用辅助数据分配的内存。

也许

struct c {
  unsigned char **arr;
  size_t rows, columns;
}