2016-02-26 3 views
-1

Так что я пытаюсь добавить Динамически выделяется char*, который возвращается из процедуры под названиемРаспределение динамической памяти C++. Назначение динамически выделенного массива переменной char * return переменной char?

GetFileInputFromUser(); 

Я динамически выделить память для переменной возврата внутри процедуры.

char* pstrReturnValue; 

// Prime the loop 
cout << "please enter a file location on your local machine (type 1 for default location) "; 
cin >> strFileInputFromUser; 

// Default location? 
if (*(strFileInputFromUser + intIndex) == '1') 
{ 
    // yes, Get the length 
    intLength = strlen(strDefaultFileLocation); 

    // Allocate memory 
    pstrReturnValue = new char[intLength]; 

    // copy default location in 
    for (intIndex = 0; intIndex <= intLength; intIndex += 1) 
    { 
     *(pstrReturnValue + intIndex) = *(strDefaultFileLocation + intIndex); 
    } 

return pstrReturnValue; 

Что мне нужно - это добавить возвращаемую переменную в другой массив символов (динамически выделяется).

void main() 
{ 
bool blnResult = false; 
ifstream ifsDataFile; 
udtNodeType* pudtHeadNode = 0; 
udtNodeType* pudtCurrentNode = 0; 
udtNodeType* pudtNextNode = 0; 
char* strFile; 

udtNodeType udtReturnNode; 

// Get the file path 
strFile = GetFileInputFromUser(); 

blnResult = OpenFile(strFile, ifsDataFile); 

// was it successful? 
if (blnResult == true) 
{ 
    // Yes 
    // populate the list and, return the top node 
    udtReturnNode = *PopulateList(pudtNextNode, pudtCurrentNode, pudtHeadNode, &ifsDataFile); 

    // All done, close the file 
    ifsDataFile.close(); 

    delete[] strFile; 

    // Delete the list 
    DeleteList(pudtNextNode, pudtCurrentNode, pudtHeadNode); 

    // Delete proof 
    PrintList(pudtNextNode, pudtCurrentNode, pudtHeadNode); 
} 

system("pause"); 
} 

Это упражнение и в соответствии с требованиями, GetFileInputFromUser() должен быть char* он должен вернуть этот указатель, и я должен удалить этот указатель, прежде чем я Утилизируйте LinkedList. Мое дело в этом, я знаю, как динамически распределять память, и я знаю, как удалить указанную память, моя проблема заключается в том, что я не могу просто присвоить значение статически выделенному char[], я не могу зациклиться на возвращаемом значении, чтобы назначить его причиной Я должен быть в состоянии получить квоту возвращения во что-то.

Я попытался сменить char* GetFileInputFromUser() на char& GetFileInputFromUser() в надежде, что я смогу получить адрес в месте нахождения в памяти и посмотреть, могу ли я надеяться, что с ним так будет де-ссылкой на возвращаемое значение.

Если вы закомментируете delete[] strFile и запустите его, все будет хорошо, но я пропущу память, и это нехорошо в моих глазах. Я знаю, что есть способ сделать это, но Google не помогает, и я застрял на этом с 1 утра прошлой ночью.

Благодарим всех вас за помощь.

+0

Если вы хотите использовать строки, а затем использовать 'станд :: string', то вы не будете иметь проблемы с выделения памяти, и у вас не будет проблем писать вне границ, которых вы делаешь сейчас. Вы * do * однако завершаете строку, но (это то, что вызовет заглавную запись), но это больше удача, я думаю. –

+0

И что касается утечки, если 'OpenFile' терпит неудачу, тогда вы все равно пропустите память. –

+0

Я не забываю закончить строку, потому что, когда я добавил UserInput к новому динамически выделенному символу char [], я копирую и через терминатор, я просто прошел через отладчик, чтобы проверить, прежде чем я разместил этот ответ. Я не могу использовать std :: String, с которым мне очень хотелось бы, но это не соответствует требованиям. – user3119737

ответ

0

Спасибо Аскарали, что вы прислали меня по правильному пути, код ниже - это то, что необходимо для получения желаемого результата без получения коррумпированного исключения кучи. Спасибо

void main() 
{ 
    char* strFile; 

    strFile = new char[50]; 

    // Get the file path 
    strcpy(strFile, GetFileInputFromUser()); 
} 
0

Если я правильно понял, вы хотите добавить одну строку в другую. Верный? Если это так, вы можете просто использовать strcat().

+0

будет работать для добавления возвращаемого массива символов в другой массив символов? – user3119737

+0

не работает, спасибо, что пытался. – user3119737

+0

char array является указателем на char: ** char ***. Так что это должно сработать. ** strcat() ** имеет два параметра: ** strcat (char * dest, const char * src); **. ** src ** будет добавлен к ** dest **. Поэтому ** dest ** должен иметь достаточный размер, чтобы удерживать ** src **. –

Смежные вопросы