【问题标题】:declare fixed size character array on stack c++在堆栈c ++上声明固定大小的字符数组
【发布时间】:2012-08-09 22:47:16
【问题描述】:

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

#include <iostream>
using namespace std;

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

        return 0;
}

打印

8

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

【问题讨论】:

  • new 与在堆栈上分配相反。您需要的是一个普通的普通数组。 char str[50]; 会很好的。如果你有 C++11,std::array&lt;char, 50&gt; str; 会更好。
  • 我会检查一下 sizeof() 测量的是什么~这不是你想象的那样。
  • 这里有一些额外的信息给你。这是一个解释 sizeOf 工作原理的链接:msdn.microsoft.com/en-us/library/4s7x1k91(v=vs.71).aspx

标签: c++ memory-management stack


【解决方案1】:
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;

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      char myArray[50] = {0};
      

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

      std::array<char, 50> arr;
      

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

      【讨论】:

      • std::array 只是 C 风格的固定长度数组的包装器,因此它应该在堆栈上。
      • 是的,你可能是对的——虽然我找不到关于这个的有效信息——修改了我的帖子。
      • 接受的答案here 有信息。
      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2015-05-05
        • 2018-03-31
        • 1970-01-01
        • 2013-07-11
        • 1970-01-01
        • 1970-01-01
        • 2021-12-01
        • 2011-12-05
        • 2010-09-08
        相关资源
        最近更新 更多