Сбой программы с указателями, пытающимися сделать 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.