Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.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“不安全”代码中的memset等效 我有一个C DLL,它的代码来自基类,它是用托管C++编写的。我无法控制基类代码 托管基类C++中的基类具有成员< /P> int *buffer_C#_C++ Cli - Fatal编程技术网

C# 与C“不安全”代码中的memset等效 我有一个C DLL,它的代码来自基类,它是用托管C++编写的。我无法控制基类代码 托管基类C++中的基类具有成员< /P> int *buffer

C# 与C“不安全”代码中的memset等效 我有一个C DLL,它的代码来自基类,它是用托管C++编写的。我无法控制基类代码 托管基类C++中的基类具有成员< /P> int *buffer,c#,c++-cli,C#,C++ Cli,被C中的派生类用零填充的memset。派生类知道缓冲区的大小 我正在使用不安全上下文访问派生类中基类的成员int*缓冲区。请让我知道是否有任何特殊的方法可以在c中的不安全上下文中memset缓冲区 我已经对此进行了详细研究,但我想知道是否有专门针对不安全上下文的内容 背景:这是一个转换项目,派生类本身以前是托管C++。现在我正在将派生类DLL单独转换为C。而且我对基类代码没有控制权!当前的代码流如下:只有派生类知道缓冲区的大小。基类通过从派生类获取缓冲区的大小来为该特定大小创建内存,但它不会零填

被C中的派生类用零填充的memset。派生类知道缓冲区的大小

我正在使用不安全上下文访问派生类中基类的成员int*缓冲区。请让我知道是否有任何特殊的方法可以在c中的不安全上下文中memset缓冲区

我已经对此进行了详细研究,但我想知道是否有专门针对不安全上下文的内容


背景:这是一个转换项目,派生类本身以前是托管C++。现在我正在将派生类DLL单独转换为C。而且我对基类代码没有控制权!当前的代码流如下:只有派生类知道缓冲区的大小。基类通过从派生类获取缓冲区的大小来为该特定大小创建内存,但它不会零填充。派生类Zero首先填充它,然后需要用它的内容适当地填充缓冲区。虽然很奇怪,但事实就是这样


谢谢

嗯,有。。。记忆集。当你可以调用真实的东西时,为什么还要接受替换呢

[DllImport("msvcrt.dll", EntryPoint = "memset", CallingConvention = CallingConvention.Cdecl, SetLastError = false)]
public static extern IntPtr MemSet(IntPtr dest, int c, IntPtr count);
取自

编辑
正如@Hans在OP评论中正确地提到的,如果您还不知道*缓冲区的大小,那么这是没有用的。

您可以自己编写代码:

void memset( byte* buffer, int value, int size )
{
    for( int i = 0; i < count; i++)
    {
        *( buffer + i ) = value;
    }
}

RtlZeroMemory实际上不是内核32中的入口点。如果你想要这样的东西,用C

public static unsafe void ZeroMemory(IntPtr Safebuffer, int count)
    {
        if (count == 0) return;
        byte* buffer = (byte*)Safebuffer.ToPointer();
        memset(buffer, count);
    }
    public static unsafe void ZeroMemory(byte* buffer, int count)
    {
        if (count == 0) return;
        while (count-- > 0)
        {
            buffer[count] = 0;
        }
    }

要么是memset,要么是ZeroMemory,因为他只想用零填充它。@ba_u朋友,使用ZeroMemory与用0?nm调用memset相比,有什么性能优势吗?找到了一个答案计数aka size_ut需要IntPtr@zezba9000没错,修正了。代码片段在犯罪方面是不充分的,但简单的解释是你不能。因为你不知道缓冲区的大小。您做得不对,C++/CLI的重点是隐藏这些实现细节。它很可能是一个数组,因此C代码可以看到一个托管数组。如果您需要一个指针来让非托管代码满意,那么可以使用pin_ptr。在C++/CLI程序中使用MeMSET不是问题。背景:这是一个转换项目,派生类本身以前是托管C++。现在我正在将派生类DLL单独转换为C。而且我对基类代码没有控制权!代码流如下:只有派生类知道缓冲区的大小。基类通过从派生类获取缓冲区的大小来为该特定大小创建内存,但它不会零填充。派生类首先填充它,然后需要用它的内容适当地填充缓冲区。你的memset实际上也不是标准的memset。标准的memset工作在字节上,这会改变大小的含义,如果值为非零,那么值的含义也会改变。我知道man,但OP问的是int*。我相信他可以根据自己的需要处理和更改代码。但是你的尺寸是对的,有点棘手。不管怎样,我改变了密码。非常感谢。
public static unsafe void ZeroMemory(IntPtr Safebuffer, int count)
    {
        if (count == 0) return;
        byte* buffer = (byte*)Safebuffer.ToPointer();
        memset(buffer, count);
    }
    public static unsafe void ZeroMemory(byte* buffer, int count)
    {
        if (count == 0) return;
        while (count-- > 0)
        {
            buffer[count] = 0;
        }
    }