gpt4 book ai didi

c++ - 数组的大小

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:06:24 25 4
gpt4 key购买 nike

这个问题是关于C++的

我一直认为C++中的数组名只是一个指针,所以我认为

int ar[10];
cout << sizeof(ar);

将给我与 sizeof(int *) 相同的值。但它给出了 40 - 所以它是整个数组的实际大小。当数组大小由变量给出时,它也会给出 40:

int n = 10;
int ar[n]

我想复制一个包含数组的类。如果它将使用运算符 new 进行分配,那么我应该在复制构造函数中手动复制此数组。但是恒定大小的数组呢?类只包含指向数组的指针,还是包含整个数组?简单的 memcpy(...) 在这里安全吗?

编辑:另一个例子:

int n;
cin >> n;
int ar[n];
cout << sizeof(ar);

并打印 n*4。我在 Linux 上使用 g++。

我什至试过这个:

class Test {
public:
int ar[4];
};

Test a, b, c;
a.ar[0] = 10;
b = a;
memcpy(&c, &a, sizeof(a));
a.ar[0] = 20;
cout << "A: " << a.ar[0] << endl;
cout << "B: " << b.ar[0] << endl;
cout << "C: " << c.ar[0] << endl;

它给出:

A: 20
B: 10
C: 10

所以数组作为类的一部分存储,可以用 memcpy 复制。但它安全吗?

最佳答案

数组不是指针。当/如果将数组的名称作为参数传递给函数时,它的名称会“衰减”为指针——但是 sizeof 是语言中内置的运算符,而不是函数,所以 sizeof(array) 产生数组的实际大小,只要它应用于实际数组(与作为参数传递的数组名称相反,然后使用 sizeof() 在传递给函数时衰减到的指针上。

就复制包含数组的类而言,如果它真的是一个数组,例如:

class X { 
int x[10];
};

然后你不需要做任何事情来复制它——编译器可以/将生成一个复制构造函数来复制数组的内容。如果(且仅当)你确实有一个指针,并自己分配空间,你是否需要编写一个复制构造函数来进行“深复制”(即在新对象中分配空间,并复制指向 TO 的数据指针)。然而,与其这样做,您通常应该使用 std::vector,它会在内部完成所有这些工作,因此您不必担心。

关于c++ - 数组的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1874493/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com