2014-11-01 1 views
0

- 제 2 판, 그들은 함수 strdup 따라서 정의 섹션 6.5 :K & R 섹션 6.5에서 기능 스트럿을 사용한 이유는 무엇입니까? <em>철도청에 의한 C 프로그래밍 언어</em>에서

char *strdup(char *s) 
{ 
    char *p; 

    p = (char *) malloc(strlen(s) + 1) /* +1 for the '\0' */ 
    if (p != NULL) 
    strcpy(p, s); 
    return p; 
} 

사용법은 구조 tnode의 멤버에 문자열을 복사하는 것입니다 따라서 정의 :

struct tnode *addtree(struct tnode *p, char *w) 
{ 
... 
p->word = strdup(w); 
... 
} 

: 다음과 같이 호출

struct tnode { 
char *word; 
int count; 
struct tnode *left; 
struct tnode *right; 
}; 

왜 우리는 대신 이런 식으로 사용할 수 없습니까?

strcpy(p->word, w); 
+0

strcpy를 문자 포인터 변수로 사용하기 전에 strdup 함수가 어딘가에 수행한다는 malloc()을 수행해야합니다. 단어는 유효한 메모리를 가리켜 야합니다. 처음 인스턴스화하면 어디든지 가리킬 수 있습니다. – Scooter

+0

당신은 *을 *로 복사하고 있다고 생각합니까? "문자열을 구조체의 멤버에 복사"- 아니, 그게 뭐하는거야 ... 그 멤버는 배열이 아니라 포인터입니다. –

+0

@Scooter 본질적으로 malloc()을 통한 명시적인 배후의 이유를 알고 싶었습니다. 나는 포인터 매개 변수의 선언이 관련 데이터 유형을위한 메모리를 할당한다는 인상 아래에 있었다. – Sohail

답변

3

의 원인이됩니다 초기화되지 않고 지정되지 않은 값이 있습니다. 2)이 문장은 할당되지 않은 메모리에 쓰기를 시도하고있다.

메모리를 할당하고 메모리의 유효 주소로 P-> 단어를 초기화하고 "같은"을 사용할 경우

strcpy(p->word, w); 

다음 사실이 strdup의 동일한 실현 자신을 작성합니다.

+0

addtree가 구조체에 대한 포인터 대신 구조체 자체를받는다면 "그와 비슷한 것이"효과가 있었 을까? – Sohail

+0

@captainsomewhere 예를 들어 구조체가 인수로 문자열을 전달하기에 충분한 크기의 문자 배열을 가지고 있다면 간단히 인수를 배열에 복사 할 수 있습니다. –

+2

@captainsomewhere :'char *'가 구조체 안에 있는지 아닌지는 * 독립적입니다. 구조 자체와는 아무런 관련이 없습니다. – usr2564301

3

먼저 당신은 다음 wordstrcpy(p->word, w);char 포인터를 사용할 수 있습니다 p->word 메모리를 할당 할 필요가없고 메모리는 이전에 할당되지 않습니다. 메모리를 할당하지 않고 strcpy(p->word, w);를 호출하는 경우 다음

strcpy(p->word, w); 

"같은"를 사용하는 경우

그래서, 그것은 1) P-> 단어 때문에 프로그램이 정의되지 않은 동작이있을 것이다 Undefined behavior.

+0

Roger. 충분한 평판이 아니라 상향 투표 할 수 없습니다. 링크를 가져 주셔서 감사합니다. – Sohail

+0

@captainsomewhere : 걱정할 필요가없는 캡틴 :) 상황을 이해하기 바란다.) – user1336087