c#char指针的指针,char**
我有这段代码(snipet),它可以运行并正常工作,但在离开整个过程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
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;
}