来自C#中字符串的char*指针

Kri*_*ris 32 c# pointers char

是否有可能获得char*一个string在C#中的变量?

我需要将路径字符串转换char*为使用某些原生win32函数...

小智 45

那么你当然可以这样做:

string str = "my string";

unsafe 
{
    fixed (char* p = str)
    {               
        // do some work
    }
}
Run Code Online (Sandbox Code Playgroud)

其中有一个运算符(char*)绑定到字符串对象.但是,输出格式可能与底层C或其他格式不兼容......但这是解析字符串的一个很好的解决方案.希望对阅读这篇文章的人有所帮助.

  • 这给出了一个指向“System.Char”元素的指针,它对应于 Win32 的“WCHAR*”,但问题要求“char *”。 (2认同)
  • @TomBlodget `char` 是 `System.Char` 的类型别名。 (2认同)

Geo*_*off 13

你可以传递StringBuilder一个char*.

看看http://pinvoke.net,看看该函数的签名是否已经存在.

  • 我尝试使用SecureString(char*,int length),并且SecureString(sb,sb.Length)或SecureString((char*)sb,sb.Length)都不起作用.说不能将System.Text.StringBuilder转换为char*. (21认同)
  • 我给出了这个答案,因为你基本上回答了我的问题,但似乎,至少对于我所做的事情,所有需要的东西都是固定的(char*s = string){...} (3认同)
  • +1,或者只是`string`,如果它只是一个输入参数. (2认同)

Lu4*_*Lu4 6

以下代码段不需要不安全的上下文(是的,它显示了有关stringGetHashCode方法实现的内部细节,这表明它与Java中的代码有所不同,因为在C#中,哈希码的值未缓存,通常它显示C#字符串最终不会像您可能已经教过的那样是不变的,无法与Fon Neiman交往):

using System;
using System.Runtime.InteropServices;

namespace Guess
{
    class Program
    {
        static void Main(string[] args)
        {
            const string str = "ABC";

            Console.WriteLine(str);
            Console.WriteLine(str.GetHashCode());

            var handle = GCHandle.Alloc(str, GCHandleType.Pinned);

            try
            {
                Marshal.WriteInt16(handle.AddrOfPinnedObject(), 4, 'Z');

                Console.WriteLine(str);
                Console.WriteLine(str.GetHashCode());
            }
            finally
            {
                handle.Free();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @zwcloud **陈述是完全错误的事情,答案是正确的,并且是最有效和最没有主见的(与不安全的情况有关)**。答案完全按照要求执行。通过`GCHandle.alloc`固定字符串的指针不会造成任何内存泄漏,除非稍后在基础上下文中强加不正确的指针使用。C#中的整个指针/内存概念被认为是低级/高级主题,如果您使用指针,则意味着您了解整个概念并基本了解自己在做什么。 (5认同)
  • 对于所引用的问题和答案,该点是完全有效的,但与上面的问题无关,没有提到有人会存储指针。如果要存储以供以后使用在C#中创建的字符串,则显然需要将其复制到C中,因为这将涉及在C中分配该字符串,这将允许C稍后将其释放。因此,这通常意味着您永远无法固定指针,将字符串的副本在C#中编组(创建)并将其存储在C中也不是一件好事,因为C以后将无法对其进行释放。 (4认同)

Hei*_*nzi 5

这取决于你想做什么。当您通过 PInvoke 调用 Win32 函数时,您应该能够仅传递 String 变量;该框架为您整理了一切。如果您需要更复杂的东西,请查看Marshal.StringToHGlobalAnsi和该类的其他方法Marshal