2010-02-09 5 views
1

함수에서 char *를 전달하고 cstring 값으로 설정해야합니다. 제대로 함수에서 문자열로 설정할 수 있지만 첫 번째 장소에서 char * 함수를 호출 한 함수에서 제대로 인쇄 할 것지 않습니다.Char * (포인터) 함수

int l2_read(char *chunk,int length) 
{ 
    chunk = malloc(sizeof(char) * length); 

    int i; 
    for(i = 0; i < length; i++){ 
     char c; 
     if(read(&c) < 0) return (-1); // this gets a single character 
      chunk[i] = c; 
    } 

    printf("%s",chunk); // this prints fine 
    return 1; 
} 


    // main 
    char *string; 
    int value = l2_read(string,16); 
    printf("%s",chunk); // prints wrong 
+0

이 숙제가 있습니까? 그리고 당신은 read()를 올바르게 호출하지 않습니다. –

+0

문자열 길이를 측정하는 경우'int' 유형 대신'size_t' 유형을 사용해야합니다. –

답변

2

방금 ​​질문을 다시 읽었습니다.

포인터가 문제 일지라도 값으로 패스 한 것 같습니다. 또한 청크가 null로 종료 되었습니까?

14

C에서는 모든 것이 값으로 전달됩니다. 기억해야 할 일반적인 규칙은 함수에 전달 된 매개 변수의 값을 변경할 수 없다는 것입니다. 변경할 필요가있는 것을 전달하고 싶다면 포인터를 전달해야합니다.

따라서 함수에서 chunk을 변경하려고합니다. chunkchar *입니다. char *의 값을 변경하려면 해당 포인터 (예 : char **)를 전달해야합니다.

int l2_read(char **chunkp, int length) 
{ 
    int i; 
    *chunkp = malloc(length * sizeof **chunkp); 
    if (*chunkp == NULL) { 
     return -2; 
    } 
    for(i = 0; i < length; i++) { 
     char c; 
     if (read(&c) < 0) return -1; 
     (*chunkp)[i] = c; 
    } 
    printf("%s", *chunkp); 
    return 1; 
} 

다음 main()의 :
char *string; 
int value = l2_read(&string, 16); 
if (value == 1) { 
    printf("%s", string); /* corrected typo */ 
    free(string); /* caller has to call free() */ 
} else if (value == -2) { 
    /* malloc failed, handle error */ 
} else { 
    /* read failed */ 
    free(string); 
} 

패스에 의한 값 C에서 그들이 할 수 있도록하려면 대신 char *endptr —의 char **endptr 매개 변수를 필요로하는 이유 strtol(), strtod() 등 이유

char * 값을 첫 번째 잘못된 char의 주소로 설정하고 호출자의 char *에 영향을 줄 수있는 유일한 방법은 포인터를 수신하는 것입니다. 즉 char *을 수신해야합니다. 마찬가지로 함수에서 char * 값을 변경할 수 있어야합니다. 즉, char *에 대한 포인터가 필요합니다.

희망이 있습니다.

2

포인터를 포인터에 전달해야합니다.

int l2_read(char **chunk,int length) 
{ 
    *chunk = malloc(sizeof(char) * length); 

    int i; 
    for(i = 0; i < length; i++) 
    { 
     char c; 
     if (read(&c) < 0) return (-1); 
     (*chunk)[i] = c; 
    } 

    printf("%s",*chunk); 
    return 1; 

} 

    char *string; 
    int value = l2_read(&string,16); 
    printf("%s",string); 
0

위의 답변에 전적으로 동의합니다. 포인터의 참조를 전달해야하므로 기본적으로 포인터의 값을 수정하고 있습니다. char * 대신 char **를 사용하십시오.