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

5

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

#include <iostream>
using namespace std;

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

        return 0;
}

打印

8

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


2
new 的作用与在堆栈上分配内存相反。你需要的是一个普通的数组。char str[50]; 就可以满足你的需求。如果你使用的是 C++11,那么 std::array<char, 50> str; 更好。 - chris
2
我会检查一下 sizeof() 究竟测量的是什么。它不是你想象中的那样。 - TheZ
这里有一些额外的信息供您参考。这是一个解释sizeOf如何工作的链接:http://msdn.microsoft.com/en-us/library/4s7x1k91(v=vs.71).aspx - Brandon
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;

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

2
要将一个C数组放在堆栈上,你必须写下:
char myArray[50] = {0};

C++中的方法是 - 正如Nawaz所指出的那样。
std::array<char, 50> arr;

但我不确定这个数组的内容是否存储在堆栈上。

1
std::array只是C风格的固定长度数组的一个包装器,因此应该放在堆栈上。 - chris
是的,你可能是对的 - 尽管我找不到关于这个的有效信息 - 我修改了我的帖子。 - RED SOFT ADAIR
这里接受的答案有信息。[链接](http://stackoverflow.com/questions/6632971/what-is-the-difference-between-stdarray-and-stdvector-when-do-you-use-one-o) - chris

1

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

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

编辑:在 C/C++ 中获取指针指向的大小没有太多意义。假设指针指向原始类型(如 intlong),那么您可以直接执行 sizeof(int)。如果指针指向数组,就像在这种情况下一样,您可以直接执行 arraySize * sizeof(dataTypeOfArray)。由于 C/C++ 不允许定义未知大小的数组,因此已经知道了 arraySize,而且已经知道了 dataTypeOfArray


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接