2015-01-22 4 views
1

문자 배열을 문자 포인터로 복사하려고합니다. 내 코드 :문자 배열을 문자 포인터로 복사하는 방법은 무엇입니까?

char str[] = "Hello World"; 
char *result = (char *)malloc(strlen(str)+1); 
int index=0; 
while(index <= strlen(str)) 
{ 
    *result = str[index]; 
    result++; 
    index++; 
} 

이 위의 코드는 작동하지 않는 코드 아래

char str[] = "Hello World"; 
char *result = (char *)malloc(strlen(str)+1); 
int index=0; 
while(index <= strlen(str)) 
{ 
    result[index] = str[index]; 
    index++; 
} 

사람이 동작을 설명 할 수 노력하고 있습니다?

+4

첫 번째 코드는 * 어쨌든 잘 작동합니다.그 문제는 포인터를 원래의 위치를 ​​가리 키지 않을 루프 이후에 포인터를 수정하는 것입니다. 다른 포인터를 변수로 만들고 루프가 'result'를 가리 키기 전에 그것이 작동한다는 것을 알 수 있습니다. –

+0

첫 번째 코드 _가 작동하지 않음을 어떻게 알 수 있습니까? – CiaPan

+1

'index <= strlen (str)'- '보다 작음'보다는 '작거나 같음'을 사용해야합니다. – CiaPan

답변

6

첫 번째 스 니펫에서 루프의 포인터를 수정하므로 루프 이후에 더 이상 malloc 호출에 의해 반환 된 동일한 위치를 가리 키지 않습니다.

그것에

봐 이런 식으로, malloc 호출 포인터와 같은 메모리 모양 후 : 루프의 첫 번째 반복 후

 
result 
| 
v 
+---+---+---+---+---+---+---+---+---+---+---+---+ 
| | | | | | | | | | | | | 
+---+---+---+---+---+---+---+---+---+---+---+---+ 

는 다음과 같이 표시됩니다

 
    result 
    | 
    v 
+---+---+---+---+---+---+---+---+---+---+---+---+ 
| H | | | | | | | | | | | | 
+---+---+---+---+---+---+---+---+---+---+---+---+ 

루프가 완료된 후에는 다음과 같이 표시됩니다.

 
               result 
               | 
               v 
+---+---+---+---+---+---+---+---+---+---+---+----+ 
| H | e | l | l | o | | W | o | r | l | d | \0 | 
+---+---+---+---+---+---+---+---+---+---+---+----+ 

복사가 m 그러나 포인터가 더 이상 원래 위치를 가리 키지 않습니다.

[참고 : 복사하기 전에, malloc에 의해 할당 된 메모리가 "빈"또는 어떤 방식으로 초기화되지 않습니다, 난 그냥 단순화하기 위해 여기처럼 보여.] 첫 번째 코드가 복사

+0

감사합니다. 요아킴은 그런 아름다운 모습으로 정교하게 대해 주셔서 감사합니다. – dcds

+3

어쩌면 우리는 OP에서'result' 포인터를 사용하여 그것을 더 이상 "자유롭게"할 수 없을 것이라고 덧붙여 야합니다; 그 이유는 내가 배열 표기법을 선호하는 이유는 그것도 더 읽을 수있다. –

1

내 의견으로는, 두 번째 스 니펫 에서처럼 오프셋을 추가 할 수있을 때 포인터를 수정하는 실제적인 이유가 없습니다 (첫 번째 코드에서와 같이). 코드를 올바르게 만드는 것이 조금 어렵습니다.

char *result = ... 
char *start = result; 

을 그리고 루프 후, 대신 result의, start를 인쇄 해보십시오 : 첫 번째 조각에 대한

,이 같은 원래의 result을 저장하려고합니다. 예상대로 새로 복사 한 문자열을 가리켜 야합니다.

+0

고마워요 ... + 1 – dcds

0

문자열은 완벽하지만이 과정에서 할당 된 문자 포인터를 이동했습니다. 그것은 당신이 단순히 문자를 복사하는 strcpy를() 함수를 사용할 수 있도록, 이미

char str[] = "Hello World"; 
char *result = (char *)malloc(strlen(str)+1); 
char *tmp = result; 
int index=0; 
while(index <= strlen(str)) 
{ 
    *result = str[index]; 
    result++; 
    index++; 
} 
printf("%s\n", tmp); 
2

는 해당 포인터에 대한 메모리를 할당 일부 임시 포인터에 초기 값을 저장 작업이있는 경우

strcpy(result,str); 

str이 결과를 복사했습니다.

+0

strcpy 대신 strncpy를 사용하는 것이 더 좋다. – sudhir

+0

@sudhi - 지정된 길이의 문자를 복사하려면'strncpy()'를 사용할 수있다. 여기에 배열 전체가 포인터에 복사되므로'strcpy()'함수를 사용하면됩니다. – Bhuvanesh

+0

@ Bhuvanesh - 당신이 맞습니다, strcpy와 strncpy 모두이 목적을 해결합니다. 그러나 strncpy는 더 많은 제어 기능을 제공 할 것입니다. 언젠가는 strcpy가 스택 손상을 일으킨다는 것을 의미합니다 (이것은 소스에서 목적지로 더 많은 데이터를 복사하려고 시도 할 때 발생할 수 있습니다). – sudhir

2

이 코드를 사용하십시오 .. strcpy() 함수를 사용하십시오.

char str[] = "Hello World"; 
char *result = (char *)malloc(strlen(str)+1); 
strcpy(result,str); 
5

우리는 단순히 strcpy 함수를 사용하여 배열을 포인터로 복사합니다.

 char str[] = "Hello World"; 
    char *result = (char *)malloc(strlen(str)+1); 
    strcpy(result,str); 
+0

나는 내 자신의 방식으로 strcpy()를 구현하고 싶다. – dcds

관련 문제