c#char指针的指针,char**

c#char指针的指针,char**,c#,pointers,char,C#,Pointers,Char,我有这段代码(snipet),它可以运行并正常工作,但在离开整个过程procedureIACLASS()并继续执行下一段代码后,它崩溃了:“坏模块错误”。我看不出有什么错误 public void procedureInAClass(){ //this code is in a Class, it works but after leaving whole procedure it crashes char** comment=(char**)Marshal.AllocHGlobal(sizeo

我有这段代码(snipet),它可以运行并正常工作,但在离开整个过程
procedureIACLASS()
并继续执行下一段代码后,它崩溃了:“坏模块错误”。我看不出有什么错误

public void procedureInAClass(){ //this code is in a Class, it works but after leaving whole procedure it crashes
char** comment=(char**)Marshal.AllocHGlobal(sizeof(char*)); //comment is in Code a class Member
string aval="some chars in a string";
SToCP(val,  comment) ; //value of String to *comment
CPToS(comment); //**comment to string
}

//this part is in a static class

    public static void SToCP(string s, char** c)//writes string s in *c
    {      
        *c = SToCP(s);
    }
    public static char* SToCP(string s) 
    {
        char* ret= (char*)Marshal.AllocHGlobal( sizeof(char) * (s.Length +1));
        int i;
        byte se = sizeof(char);
        for (i = 0; i < s.Length; i++)
            *(ret + se * i) = s[i];
        *(ret + s.Length * se) = '\0';
        return ret;
    }



public static String CPToS(char** c)
    { 
          return CPToS(*c); //passing the pointer char* which is holded by char** c
    }

public static String CPToS(char* c)
    {
        string ret = "";
        byte s = sizeof(char);//char is two bytes long
        int i = 0;
        while (*(c + s * i) != '\0')//zero terminated string
            ret += *(c + s * i++);
        return ret;
    }
public void procedureInAClass(){//此代码位于类中,它可以工作,但离开整个过程后崩溃
char**comment=(char**)marshall.AllocHGlobal(sizeof(char*);//comment在代码中是类成员
string aval=“字符串中的一些字符”;
SToCP(val,comment);//要*comment的字符串的值
CPToS(注释);//**注释到字符串
}
//此部分位于静态类中
公共静态void SToCP(字符串s,char**c)//在*c中写入字符串s
{      
*c=SToCP(s);
}
公共静态字符*SToCP(字符串s)
{
char*ret=(char*)marshall.AllocHGlobal(sizeof(char)*(s.Length+1));
int i;
字节se=sizeof(char);
对于(i=0;i
您的问题是将索引
i
乘以
sizeof(char*)
,但将其视为
char*
。将1添加到字符*将字符大小(2字节)添加到指针。您正在每隔一个字符写入一个字符,然后在字符串分配后继续覆盖内存,因为执行得太远了

请尝试以下方法:

public static char* SToCP(string s) {
    char* ret = (char*)Marshal.AllocHGlobal(sizeof(char) * (s.Length + 1));
    char* p = ret;
    for (int i = 0; i < s.Length; i++)
        *(p++) = s[i];            
    *(p++) = '\0';
    return ret;
}
SToCP
导致堆栈出错并导致崩溃

public static String CPToS(char* c) {
            string ret = "";
            int i = 0;
            while (*(c +  i) != '\0')//zero terminated string
                ret += *(c +  i++);
            return ret;
        }