2014-09-23 4 views
1

Я пытался реализовать свою собственную функцию копирования строк в C++скопировать строковую функцию

void pcstrdup(const char* szStr, char* szStrCpy) 
{ 
    int nLen = strlen(szStr); 
    if (!nLen) 
     throw "Error : attempt copying an empty string"; 
    ++nLen; 
    szStrCpy = static_cast<char*>(malloc(sizeof(char) * nLen)); 
    if (!szStrCpy) 
     throw "Error : memory allocation failed"; 
    for (int i = 0; i < nLen; i++) 
    { 
     szStrCpy[i] = szStr[i]; 
    } 
} 

Я отлаженный и проверил, что символы копируются и копирует их все, но в \ 0 символ, когда он попадает в тот момент я получаю исключение

Unhandled exception at 0x011A5BA1 in assignment2.exe: 0xC0000005: Access violation reading location 0x00000000. 

что приводит меня к этой функции:

static size_t __CLRCALL_OR_CDECL length(const _Elem *_First) 
    { // find length of null-terminated string 
    return (*_First == 0 ? 0 
     : _CSTD strlen(_First)); 
    } 

Обратите внимание, что й Функция e istrlen() - это функция, которую я написал.

int istrlen(const char* szStr) 
{ 
    int count = 0; 
    for (int i = 0; szStr[i] != NULL; i++) 
    { 
     ++count; 
    } 
    return count; 
} 
+0

Почему так много строк копия вопросы сегодня? Это домашнее задание? – CoryKramer

+0

Почему это ошибка при копировании пустой строки? – Barmar

+1

"' szStrCpy = static_cast (malloc (sizeof (char) * nLen)); "Я вышел. :( –

ответ

3

Проблема заключается в вашем объявлении функции:

void pcstrdup(const char* szStr, char* szStrCpy) 

При назначении szStrCpy памяти, вызывающие не видят изменений, поскольку указатель передается по значению. Когда возвращается ваш pcstrdup, память, выделенная для szStrCpy, будет потеряна, а вызывающая сторона увидит старое значение (в данном случае это выглядит как NULL).

Вы можете это исправить, передав szStrCpy по ссылке:

void pcstrdup(const char* szStr, char *&szStrCpy) 

еще лучше, вы должны вернуться szStrCpy, а не принимать его в качестве второго параметра:

char *pcstrdup(const char* szStr) 
+0

Он должен действительно вернуть szStrCpy из функции и опустить параметр szStrCpy из своей функции. Так что нечто большее по строкам 'char * pcstrdup (const char * szStr)'. Я поднял ваш ответ. –

+0

@dasblinkenlight Если я выделяю пространство памяти указателю внутри этой функции, он будет указывать только на этот адрес памяти в функции и вернется, указывая на исходный адрес после возврата функции? что, если я уже выделил память указателю вне функции, а затем изменил * значение * адреса указатель, указывающий на функцию, останется ли изменение после возвращения функции? Также, чтобы заставить его возвращать char *, вместо этого не будет более сложно управлять указателями? –

+0

, потому что если бы мне тогда понадобилось сделать указатель на указатель на char, который является возвращаемым указателем char, если бы я хотел получить доступ к возвращенному указателю в будущем, чтобы я мог освободить его отсюда? (продолжение) –

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