【发布时间】:2014-02-08 23:10:58
【问题描述】:
来自 C 的 Iirc,您可以按照以下方式声明:
char* str = "1234";
int nonStr = *((int*)str);
(我故意将字符串设置为 4 个字符,因此在一般情况下,它将具有与整数相同的字节数。)这将取消引用存储 str 的内存,并在它是整数时为您提供值(522207554 如果我转换正确)。
有没有办法在 C# 中做同样的事情?我知道这是一个低级内存操作,通常对 C# 程序员隐藏起来,我只是为了教学练习。
【问题讨论】:
-
一个“教学”练习!当然,我们希望鼓励良好的习惯,而不是像这样滥用指针——尤其是在 C# 中。如果您想教授指针滥用,至少要在适当的上下文中进行 - 在低级/OS 环境中使用 C/C++。不是 C#。
-
.NET String to byte Array C# 的可能重复项
-
@Skizz 滥用它们的全部意义在于“指出”它们可能被滥用,即使是偶然的。我想解释一下幕后记忆中发生了什么,这样学生们就会明白为什么他们会得到
InvalidCastException!我不打算教他们以这种方式编写“真正的”程序。 -
.NET 中有
IntPtr对象,您可以在unsafe块中进行指针操作。您要从哪个指针开始操作?除非它是 IntPtr、封送处理的东西或在不安全块内创建的指针,否则就低级内存操作而言,我认为您无能为力。 -
@just.another.programmer:
str指向一个静态分配的chars 数组,严格的别名规则说(大约)你不能访问一个对象通过指向不同类型的指针进行类型(除了少数例外,这不属于)。这允许某些有时需要的优化。您问题中的代码可以使用memcpy(&nonStr, str, sizeof(nonStr))删除其未定义的行为。 (这会调用允许的例外之一——非char的东西可以用作char,但反之则不行。)更多信息可在其他地方获得。
标签: c# memory casting low-level