5

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

#include <iostream>
using namespace std;

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

        return 0;
}

印刷

8

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

4

4 回答 4

10
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;
于 2012-08-13T16:58:44.847 回答
8

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

于 2012-08-13T16:58:52.883 回答
2

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

char myArray[50] = {0};

执行此操作的 C++ 方法是 - 正如 Nawaz 所指出的

std::array<char, 50> arr;

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

于 2012-08-13T17:02:30.360 回答
1

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

您也无法确定sizeof参考(在这种情况下,字符数组的大小)。这是因为编译器不知道指针指向什么。

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

于 2012-08-13T17:02:19.073 回答