Сбой программы с указателями, пытающимися сделать strcpy-подобным - PullRequest
1 голос
/ 12 февраля 2010

Это моя вторая проблема сегодня, указатели вызывают у меня кошмары. Я пытаюсь сделать программу, которая делает то же самое, что делает функция 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 ]

4 голосов
/ 12 февраля 2010

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

* +1007 *

Кроме переменной

char *copied = 0 ;

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

char copied[20];
3 голосов
/ 12 февраля 2010

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

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

* +1007 *
1 голос
/ 12 февраля 2010

Исправлено:

 #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
}
1 голос
/ 12 февраля 2010

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

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 байтов из кучи.

0 голосов
/ 12 февраля 2010

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

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

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

...