2010-07-15 2 views
3

Вот часть моего кода:копия символ * на символ *

extern "C" REGISTRATION_API int extreme(char* lKey) 
{ 
string s1; 
char *p=NULL; 
try 
{ 
    ifstream myfile ("extreme.txt"); 
    int i=0; 
    if (myfile.is_open()) 
    { 
    while (getline(myfile,s1)) 
     { 
     switch (i) 
     { 
     case 1: 
     strcpy(p,s1.c_str()); 
     lKey=p; 
     break; 
      //continue here 
     } 
     } 
    } 
} 

Теперь, когда я эта функция вызывается из внешнего приложения, я получаю эту ошибку:

AccessViolationException:
Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

Проблема обусловлена это:

lKey=p; 

Как я могу назначить lKey для p?

+0

Где вы выделили память указателю p? –

ответ

8

Вам нужно предварительно выделить память, который вы передаете strcpy. То есть a p = new char[s1.length()+1]; сделает это (+1 для завершающего 0 символа). Тем не менее, не стоит смешивать std::string и строковые подпрограммы C без уважительной причины. Лучше придерживаться std::string, это спасет вас от неприятностей.

Также не работает lKey=p - он просто копирует локальный адрес p в локальную переменную lKey. Вызывающий не увидит разницы.

+0

Что делать, если я хочу выполнить некоторые изменения на p, а затем назначить его lkey? скажем: i call methodone (p); , и тогда я хочу назначить результат lkey, как это сделать? – Zee99

+0

Привет, Александр, У меня такая же проблема, и я нашел ваш ответ полезным. У меня есть один маленький вопрос: не могли бы вы подробно остановиться на своем втором абзаце? Что понадобится вместо lKey = p, чтобы вызывающий абонент правильно получил новое значение в lkey? Cheers – ibiza

+0

@ibiza: lKey должен быть выделенным вызовом буфером, тогда вы можете 'strcpy' к нему. Тем не менее, будьте осторожны, чтобы не работать над концом буфера. В качестве альтернативы используйте вместо этого 'char **' и функцию 'malloc' - буфер, достаточно большой для хранения строки. –

10

На самом деле проблема strcpy(p,s1.c_str());, так как p никогда не устанавливается ничем, кроме NULL.

+0

@ Zee99 strcpy просто копирует данные. p - указатель на память, которая не выделена. Поэтому при копировании вы просто копируете в ячейку памяти 0, что является незаконным. –

7

Помните, что char* - это всего лишь адрес ячейки памяти. Вы должны иметь выделенную память по адресу.

В вашем коде у вас нет памяти, выделенной для использования, и вы не установили p для указания на этот адрес памяти.

strcpy не выделяет буфер, он просто берет адрес памяти для копирования данных.

Если вы передаете буфера в функции, то вы, вероятно, хотите просто это (и удалить р)

strcpy(lKey, s1.c_str()); 
1
  1. Устранить р (он не делает ничего здесь), и скопировать данные из s1 непосредственно lkey
  2. Не бить на вас, но схема отступа является пародией, пожалуйста, полицейский хороший стиль где-то (google 1tbs)
Смежные вопросы