strcpy-like를 만들려고하는 포인터와의 프로그램 충돌
문제
이것은 오늘 나의 두 번째 문제입니다. 포인터는 나에게 악몽을주고 있습니다. 나는 strcpy () 함수와 같은 일을하는 프로그램을 만들려고 노력하고있다. 일단 시도한 후에 .. 충돌하고 나는 그것이 내 코드에서 포인터 문제라고 확신한다. 나는 일종의 양의 지형화 된 포인터가 있기 때문에 (*복사). 그러나 나는 그것에 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)
). 복사 된 문자열을 올바르게 인쇄하려면 마지막 문자는 0이어야하지만 마지막 문자는 ~ 아니다 당신의 기능에 의해 복사. 그래서 그것은 오히려와 같아야합니다
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 original[ 15 ] = "this is a text";
char copied[ 15 ] = "this is a text";
OR
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 포인터 오류입니다.