【问题标题】:How to get dynamic array's size in C?如何在 C 中获取动态数组大小?
【发布时间】:2021-03-23 23:47:29
【问题描述】:

我正在尝试使用 sizeof 在 C 中获取 动态数组 的大小。 我有结构,并使其包含 10 个元素。

struct date{
int day;
int month;
int year;
};

void main(){
struct date *table;

table = (struct date*) malloc(sizeof(struct date) * 10);
}

所以当我尝试使用 sizeof 获取大小时,我得到 8 而不是 120(因为结构的大小是 12)。

printf("%d, sizeof(table)); 
output is 8

我没有将其设为动态数组,而是将其更改为静态数组以查看会发生什么,结果为 120。所以我不明白问题出在哪里。我知道我不能说 sizeof(*table) 因为它会给出第一个元素的大小。出于上下文目的,需要使用动态数组来扩展每个新数据的大小。

【问题讨论】:

  • 在编译期间评估 sizeof 表达式。它为您提供操作数类型的大小。对于动态数组,它为您提供指针的大小,通常为 4 或 8 个字节(取决于底层平台)。

标签: arrays c pointers dynamic-memory-allocation


【解决方案1】:

在您的示例中,table 的类型为 struct date *。因此,当您在其上使用 sizeof 运算符时,您将获得指针的大小。

没有可移植的方法来确定指向已分配内存的指针指向多少可用空间。您需要自己跟踪。

【讨论】:

  • 这适用于将静态数组传递给函数吗?举个例子,如果我有 struct date array[10] 的静态数组,并且想在另一个函数 printSize(struct date a[]) 中打印数组的大小,这种情况会发生吗?
  • @kimboi 数组在传递给函数时会转换为指向其第一个元素的指针,因此在这种情况下您还将获得指针的大小。您需要在单独的参数中将大小传递给函数。
【解决方案2】:

唯一的方法是将尺寸信息存储在本例中的某处:

typedef struct
{
    size_t size;
    int arr[];
}int_array_t;

int_array_t *alloc(size_t nelem)
{
    int_array_t *arr = malloc(sizeof(*arr) + nelem * sizoef(arr -> arr[0]));

    if(arr)
    {
        arr -> size = nelem;
    }
    return arr;
}

【讨论】:

    猜你喜欢
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多