Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何读取堆栈分配内存的元素计数?_C#_Stackalloc - Fatal编程技术网

C# 如何读取堆栈分配内存的元素计数?

C# 如何读取堆栈分配内存的元素计数?,c#,stackalloc,C#,Stackalloc,假设我只有一个以前堆栈分配内存的指针,我想知道我有多少个元素。怎么做 说明:“使用stackalloc会在公共语言运行时自动启用缓冲区溢出检测功能”,因此我猜大小会保留在某个地方。您要查找的信息不存在,您有责任跟踪此信息 缓冲区溢出检测不会检查“数组”上的越界访问-没有数组。相反,它使用在堆栈上分配的内存之后添加的随机值。在函数epilog中,它检查值是否仍然存在,如果不存在,则终止整个过程 不用说,这并不能确保您不会遭受缓冲区溢出(或下溢,这是本文主要关注的问题)。它只是试图限制其潜在影响。

假设我只有一个以前堆栈分配内存的指针,我想知道我有多少个元素。怎么做


说明:“使用
stackalloc
会在公共语言运行时自动启用缓冲区溢出检测功能”,因此我猜大小会保留在某个地方。

您要查找的信息不存在,您有责任跟踪此信息

缓冲区溢出检测不会检查“数组”上的越界访问-没有数组。相反,它使用在堆栈上分配的内存之后添加的随机值。在函数epilog中,它检查值是否仍然存在,如果不存在,则终止整个过程


不用说,这并不能确保您不会遭受缓冲区溢出(或下溢,这是本文主要关注的问题)。它只是试图限制其潜在影响。结合将
stackalloc
ced局部变量保存在尽可能小的函数中,这是一种非常简单但仍然非常有效的防止恶意代码执行的方法。您仍然可以覆盖(或读取)其他局部变量,但不能覆盖例如函数返回指针。

数组将其长度作为数据的一部分。从C#7.2开始,您可能会使用
Span
来封装块,然后您就有了可用的长度(以及安全访问):
Span b=stackalloc byte[100];控制台写入线(b.长度)谢谢你的回答和链接。我不知道这是怎么处理的。