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

时间:2012-08-13 16:57:05

标签: c++ memory-management stack

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

#include <iostream>
using namespace std;

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

        return 0;
}

打印

8

如何在堆栈上分配固定大小的数组(在这种情况下为50个字节但可能是任何数字)?

4 个答案:

答案 0 :(得分:8)

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;

答案 1 :(得分:8)

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

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

char myArray[50] = {0};

C ++的方法是 - 正如纳瓦兹所说的那样

std::array<char, 50> arr;

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