2014-03-13 6 views
0

나는 C 프로그래밍에 익숙하다. 포인터와 문자열에 대해서 배울 것이다. 포인터와 문자열로 작업 할 때 우리는 동적 메모리 할당을 사용하여 선언하고자하는 문자열을 할당해야한다. 나는 원한다. C 함수 라이브러리 strlen()을 사용하지 않고 문자열의 길이를 계산하십시오. 그러나 왜이 코드는 문자열의 실제 길이를 제공하지 않습니다. *stringstring[50]으로 바꾸면 배열을 사용하여 계산할 때 코드가 제대로 작동하고 나에게 줄 수 있습니다. 문자열의 실제 길이. 메모리 할당과 동적 메모리 할당

이 코드 :

enter string: 
programming 
length=2 
+0

'len'을 초기화하지 않기 때문에. (온화한) 최적화와 * 모든 * 적절한 경고 플래그 (GCC에서는'-O -Wall', 아마도 조금 더)로 컴파일하십시오. 위와 같은 실수에 대해 알려야합니다. – vonbrand

답변

3

귀하의 코드가 닭과 달걀 문제를 설명 : 내가 그 코드를 실행하면

#include <stdio.h> 
#include <stdlib.h> 

int len(char *string); 

int main(void){ 
char *string; 

string=(char *)malloc(len(string+1)); 

puts("enter string:"); 
fgets(string,sizeof(string),stdin); 

printf("length=%d\n",len(string)); 
return 0; 
} 

int len(char *string){ 
int len; 

while(*string!='\0'){ 
    string++; 
    len++; 
} 
return len-1; 
} 

이있다. 길이를 계산하려면 길이를 계산하는 데 필요한 공간을 할당하기 위해 할당 된 공간 &이있는 포인터가 필요합니다.

  1. 의 malloc(), 당신이 그것을 의미, 아직 초기화 또는 메모리를 할당되지 않은 포인터 인 string을 전달하는에서

    string=(char *)malloc(len(string+1));

    에서 일부 쓰레기 값을 포함합니다. 그리고 그 길이를 len()으로 계산하면, 여기에 포함 된 쓰레기 주소를 참조 해제합니다. 놀랍게도 여기에는 segfault가 없습니다.

  2. 그리고 당신은 당신의 len() 기능에 len 변수를 초기화하지 않은, 그냥 len에 포함 된 반환하는 쓰레기 값을 추가합니다.

나는 코드를 실행하고 있기 때문에 위에서 언급 한 문제로 나에게 세그먼트 오류했다.