2016-09-25 3 views
0

'c'가 함수 안에 인쇄 될 때 두 문자열의 연결을 얻습니다. 그러나 포인터의 주소가 반환되고 "i"가 주 내부에 인쇄 될 때, 출력이 적절하지 않습니다. 내가 볼포인터에 문자 배열 전달 및 문자열 연결

#include <stdio.h> 

char* comp(char* s,char* t) 
{ 
int count=0; 
char *c; 
c=s; 
while(*s!='\0') 
    s++; 
for(;*t!='\0';t++,s++) 
    *s=*t; 
return c; 
} 

int main(){ 
char* i; 
char c[]= "hello there"; 
char f[]="world"; 
i=comp(&c,&f); 
printf("%s",i); 
return 0; 
} 
+2

[C에서 메모리 주소를 인쇄하는 방법] 가능한 복제본 (http://stackoverflow.com/questions/30354097/how-to-printf-a-memory-address-in-c) – wasthishelpful

+1

명확한 설명을 위해, 당신은 포인터 변수의 주소를 반환하지 않습니다. 당신이 그렇게했다면 당신은 (다행스럽게도)하지 않는'return & c'를 할 것입니다. 포인터를 반환하는 것입니다. 또한 잘못된 인수를 사용하여 함수를 호출하고 있습니다. 호출에서 주소 연산자를 사용하지 말고, 그대로 배열을 전달하면 컴파일러는 첫 번째 요소에 대한 포인터를 잃게됩니다. 예 : 'f'와'& f [0]'의 배열'f'는 같습니다. '& f'라는 표현은 실제로 여기에 잘못되었습니다. –

+0

가장 가능성있는 읽기 전용 메모리 위치에 데이터를 추가하려고합니다.그리고 읽기 전용이 아니더라도 할당 된 메모리를 지나가고 있습니다. 이것은 정의되지 않은 동작입니다. 정의되지 않은 동작이있을 때 "이유"를 묻지 않아도됩니다. –

답변

3

문제 :

문제는 1

당신은 comp에 연결된 문자열을 널 종료되지 않습니다.

char* comp(char* s,char* t) 
{ 
    int count=0; 
    char *c; 
    c=s; 
    while(*s!='\0') 
     s++; 
    for(;*t!='\0';t++,s++) 
     *s=*t; 

    // Need this 
    *s = '\0'; 
    return c; 
} 

당신은 잘못 함수를 호출 2

문제. 당신은 사용할 필요가 :

i=comp(c, f); // Not comp(&c, &f) 

문제 3

에 가장 심각한 문제는 당신이 안되는 메모리를 통해 작성하는 것입니다 : 당신이 사용하는 경우

:

char c[]= "hello there"; 
char f[]="world"; 

c에는 "hello there"f 문자열을 저장할만큼 메모리가 충분합니다. 문자열을 보유하는 메모리 "world". 이러한 제한을 초과하여 쓰려고하면 정의되지 않은 동작이 발생합니다. 당신은 사용할 수 있습니다 c가 연결된 문자열을 유지하기에 충분한 공간이 있기 때문에 확인 될 것입니다

char c[100]= "hello there"; 
char f[]="world"; 
i = comp(c, f); 

합니다.

char c[12] = {'h', 'e', 'l', 'l', 'o', ' ', 't', 'h', 'e', 'r', 'e', '\0'}; 

것과 "world"을 덧붙이하면 다음을 수행하는 것과 같습니다 : OP의 의견

char c[]= "hello there"; 

에 응답

업데이트에 해당합니다

c[11] = 'w'; 
c[12] = 'o'; 
c[13] = 'r'; 
c[14] = 'l'; 
c[15] = 'd'; 
c[16] = '\0'; 

을 그 정의되지 않은 행동의 원인이다. 또는 범위를 벗어난 인덱스를 사용하여 배열 요소를 덮어 쓰고 있기 때문입니다. 범위를 벗어난 인덱스를 사용하여 배열의 요소에 액세스하는 것조차도 정의 된 동작의 원인입니다.

+0

감사합니다. 그러나 문제를 조금 정교하게 설명 할 수 있습니까? 나는 C로 메모리 관리에 대해 많은 생각을 갖고 있지 않지만, 나는 정말로 배우기를 좋아할 것이다. –