在堆栈 C++ 上声明固定大小的字符数组

declare fixed size character array on stack c++

本文关键字:字符 数组 堆栈 C++ 声明      更新时间:2023-10-16

我正在尝试在堆栈上创建一个固定大小的字符数组(它确实需要堆栈分配)。 我遇到的问题是我无法让堆栈为数组分配超过 8 个字节:

#include <iostream>
using namespace std;
int main(){
        char* str = new char[50];
        cout << sizeof(str) << endl;
        return 0;
}

指纹

8

如何在堆栈上分配一个固定大小的数组(在本例中为 50 字节,但它可以是任何数字)?

char* str = new char[50];
cout << sizeof(str) << endl;

它打印指针的大小,该大小在您的平台上8。它与这些相同:

cout << sizeof(void*) << endl;
cout << sizeof(char*) << endl;
cout << sizeof(int*) << endl;
cout << sizeof(Xyz*) << endl;  //struct Xyz{};

所有这些都会在您的平台上打印8

您需要的是以下之一:

//if you need fixed size char-array; size is known at compile-time.
std::array<char, 50> arr; 
//if you need fixed or variable size char array; size is known at runtime.
std::vector<char> arr(N); 
//if you need string
std::string s;

实际上,您正在分配 50 * sizeof(char) 或 50 个字节。 sizeof(str)是指针大小的sizeof(char*)

要将 C 数组放在堆栈上,您必须编写

char myArray[50] = {0};
做到这一点

C++方法是 - 正如纳瓦兹指出的那样

std::array<char, 50> arr;

但我不确定这个数组的内容是否会驻留在堆栈上。

这里的

str引用的是大小为 50*sizeof(char) 的字符数组。但是sizeof(str)打印的是str变量的sizeof,而不是它所引用的sizeofstr这里只是一个指针变量,指针变量是一个无符号整数,其大小为 8

此外,您无法确定引用sizeof(在本例中为字符数组的大小)。这是因为编译器不知道指针指向什么。

编辑:获取指针指向的内容的sizeof在C/C++中没有多大意义。假设指针指向基元类型(如intlong),那么您可以直接执行sizeof(int)。如果指针指向一个数组,就像在这种情况下,你可以直接做arraySize * sizeof(dataTypeOfArray)。 无论如何arraySize是已知的,因为 C/C++ 不允许定义未知大小的数组,并且无论如何dataTypeOfArray都是已知的。