문제 :
문제는 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';
을 그 정의되지 않은 행동의 원인이다. 또는 범위를 벗어난 인덱스를 사용하여 배열 요소를 덮어 쓰고 있기 때문입니다. 범위를 벗어난 인덱스를 사용하여 배열의 요소에 액세스하는 것조차도 정의 된 동작의 원인입니다.
[C에서 메모리 주소를 인쇄하는 방법] 가능한 복제본 (http://stackoverflow.com/questions/30354097/how-to-printf-a-memory-address-in-c) – wasthishelpful
명확한 설명을 위해, 당신은 포인터 변수의 주소를 반환하지 않습니다. 당신이 그렇게했다면 당신은 (다행스럽게도)하지 않는'return & c'를 할 것입니다. 포인터를 반환하는 것입니다. 또한 잘못된 인수를 사용하여 함수를 호출하고 있습니다. 호출에서 주소 연산자를 사용하지 말고, 그대로 배열을 전달하면 컴파일러는 첫 번째 요소에 대한 포인터를 잃게됩니다. 예 : 'f'와'& f [0]'의 배열'f'는 같습니다. '& f'라는 표현은 실제로 여기에 잘못되었습니다. –
가장 가능성있는 읽기 전용 메모리 위치에 데이터를 추가하려고합니다.그리고 읽기 전용이 아니더라도 할당 된 메모리를 지나가고 있습니다. 이것은 정의되지 않은 동작입니다. 정의되지 않은 동작이있을 때 "이유"를 묻지 않아도됩니다. –