【问题标题】:(C++) Array as member of struct: how to get its size?(C++)数组作为结构的成员:如何获得它的大小?
【发布时间】:2021-08-09 16:08:01
【问题描述】:

我有一个结构,它有一个指向数组的指针作为成员,我想确定这个数组的大小。

#include <stdio.h>

int array[]={1,2,3,4,5};

struct myStruct {
    int *array;
};

struct myStruct my_struct={.array=array};

int main() {
    printf("A: %d\n",sizeof(array)/sizeof(*array)); // this works
    printf("B: %d\n",sizeof(my_struct.array)/sizeof(*my_struct.array)); // this doesn't work
}

打印出来:

A: 5
B: 2

我预计:

A: 5
B: 5

当我直接在数组上使用sizeof(a)/sizeof(*a) 方法时,它可以工作,但在myStruct 的成员上使用时它不起作用。起初我以为我不能像这样将指针分配给数组成员,但是索引my_struct.array[i] 会返回正确的值。但是因为我想遍历这个数组,所以我需要知道它的大小。

谁能向我解释为什么我的尝试不起作用以及如何实现它?

【问题讨论】:

  • 您全局声明的第一个数组是静态分配的,因此当您调用sizeof(array) 时,它会为您提供它总共使用的字节数。虽然你的结构中的数组并不是真正的数组,它只是一个指针,所以sizeof(struct.array) 只是给你指针的大小,它在你的计算机中似乎是 4 ,因此 4 / 2 = 2 。从结构内部将int *array 更改为int array[5],您将看到所需的结果。
  • @fvalasiad 嗯,我明白了。我实际上想让这个数组具有可变大小。有没有办法解决它,还是在 C++ 中通常是不可能的?
  • 您想使用动态数组吗?如果是这种情况,请使用std::vector。除非你的意思是你想自己创建一个动态数组,否则你应该在你的结构中添加一个size_t size 属性来保存数组的大小并相应地动态重新分配内存。
  • @fvalasiad 数组在运行时不会改变,但我想要这个结构的几个实例,每个实例都有不同大小的数组。但包括size 属性对我有用。感谢您的帮助!

标签: c++ arrays pointers struct sizeof


【解决方案1】:

正如here 所讨论的,编译器不知道int* array 指向一个int 类型的数组,因此sizeof() 只返回指针的大小。

所以要么使用std::vector,要么在你的结构中添加一个 size 成员。

【讨论】:

  • int* array 从来不是一个数组。这是一个指针。它指向intint 可能是 int 数组中的第一个元素,但是,正如这个答案所暗示的,它仍然只是一个指针。 +1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-23
  • 2021-06-04
相关资源
最近更新 更多