Ваша проблема в том, что вы умножаете свой индекс 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;
}
Конечно, ваш метод CPToS
такженеправильно, поэтому, если вы исправите SToCP
, чтобы корректно не записывать поверх другого символа, вам также нужно будет исправить CPToS
, иначе он вернет неправильную строку обратно.
Вот исправленная версия CPToS
для совпадения:
public static String CPToS(char* c) {
string ret = "";
int i = 0;
while (*(c + i) != '\0')//zero terminated string
ret += *(c + i++);
return ret;
}
SToCP
приводил к повреждению стека и к аварийному завершению.