Сбой программы с указателями, пытающимися сделать strcpy-подобным

Это моя вторая проблема сегодня, указатели дают мне кошмары. Я пытаюсь сделать программу, которая делает то же самое, что и функция strcpy(). Как только я попробую это..., она падает, и я на 100% уверена, что это проблема с указателями в моем коде. Я думаю, потому что есть какой-то неиспользованный указатель (* скопированный) ... Но я назначил ему NULL... так кто-нибудь может сказать мне, для чего именно назначение Null? потому что я думаю, что я неправильно понимаю его использование. и скажите, пожалуйста, какие исправления можно внести, чтобы программа работала нормально.

 #include <iostream>
 using namespace std;

 void mycpy(char *b , char *a);

 int main()
 {

    char *original = "this is a text" ;
    char *copied = 0 ;

    mycpy(copied , original);

    for(int i = 0 ; *(copied+i) ;i++) cout << *(copied+i) ;

    return 0;
}

void mycpy(char *b , char *a){

    for(int i = 0 ; *(a+i) ; i++) *(b+i) = *(a+i);

}

Заранее спасибо.

5 ответов

Решение

Ну твой mycpy почти правильно (хотя вы могли бы использовать скобки вместо арифметики, т.е. a[i] вместо *(a+1)). Для правильной печати скопированной строки последний символ должен быть нулем, но последний не копируется вашей функцией. Так что скорее должно быть

void mycpy(char *b , char *a)
{
    int i;
    for(i = 0 ; *(a+i) ; i++) *(b+i) = *(a+i);
    *(b+i) = 0; // or "\0", doesn't matter    
}

Кроме того, переменная

char *copied = 0 ;

не указывает на действительную память, поэтому вы читаете из позиции памяти 0, что недопустимо. Вы можете определить переменную как массив

char copied[20];

Вы должны выделить немного памяти для результата операции копирования.

В твоем случае copied не был инициализирован, поэтому вы пытаетесь записать нулевой указатель. Следующее выделит достаточно памяти для копирования original в copied

char* copied = new char[strlen(original)+1];

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

char *original;

Это просто указатель на некоторую память типа char. Вы не можете установить это "это текст", потому что это просто указатель. В нем нет места для хранения "это текст".

char original[ 15 ] = "this is a text";
char copied[ 15 ] = "this is a text";

будет работать, или

char *original;
char * copied;

original = malloc( 15 );
copied = malloc( 15 );

mycpy( original, "this is a text" );
mycpy( copied, original );

Оба эти метода занимают 15 байтов для хранения вашего текста. Первый пример использует 15 байтов из стека. Второй пример использует 15 байтов из кучи.

Исправлена:

 #include <iostream>
 using namespace std;

 void mycpy(char *b , char *a);

 int main()
 {

    char *original = "this is a text" ;
    char copied[30]; // you need to actualy allocate space 
    // (this is on stack, you could use new as well, for heap allocation)

    mycpy(copied , original);

    for(int i = 0 ; *(copied+i) ;i++) cout << *(copied+i) ;

    return 0;
}

void mycpy(char *b , char *a){
    int i =0;
    while (*(a+i)) {
        *(b+i) = *(a+i);
        ++i;
    }
    *(b+i) = '\0'; // null termination
}

В этой строке:

for(int i = 0 ; *(a+i) ; i++) *(b+i) = *(a+i);

это разыменование b+i это вызывает ошибку. Вы разыменовываете 0 (NULL), что является ошибкой указателя номер 1.

Другие вопросы по тегам