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

StackOverflow https://stackoverflow.com/questions/2254645

  •  20-09-2019
  •  | 
  •  

Вопрос

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

}

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

Это было полезно?

Решение

Ну, твой 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top