2013-03-25 1 views
3

char 배열과 char 포인터를 호출하여 함수로 이동하는 올바른 방법이 있습니까?하지만 조작 할 수있는 참조로 전달됩니까? 이 같은올바르게 char 배열과 char 포인터를 C로 참조로 함수로 전달

뭔가 : 나는 함수에 같은 변수를 전달하고 문자 될 일이 그 변수의 값을 변경/문자열하는 방법을 제대로 이해 해요 경우

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

void manipulateStrings(char *string1, char *string2[]) 
{ 

    strcpy (string1, "Apple"); 
    strcpy (string2, "Banana"); 

    printf ("2 string1: %s", string1); 
    printf ("2 string2: %s", &string2); 

} 


int main() 
{ 
    char *stringA; 
    char stringB[1024]; 

    stringA = (char *) malloc (1024 + 1); 

    strcpy (stringA, "Alpha"); 
    strcpy (stringB, "Bravo"); 
    printf ("1 stringA: %s", stringA); 
    printf ("1 stringB: %s", stringB); 

    manipulateStrings(stringA, stringB); 

    printf ("3 stringA: %s", stringA); 
    printf ("3 stringB: %s", stringB); 


    return 0; 
} 

나는 확실하지 않다

편집 : 내 질문은 - 어떻게 함수에서 두 문자열의 값을 변경할 수 있습니까?

+2

무엇이 문제입니까? – Andrey

+0

@Andrey - 내 질문을 명확히하기위한 편집을 추가했습니다. – AisIceEyes

답변

11

C에서 참조로 전달 된 것과 같은 것은 존재하지 않습니다. C에서 모든 것이 값으로 전달됩니다. 이렇게하면 필요한 솔루션을 얻을 수 있습니다. 다른 수준의 간접 참조를 추가하십시오.

그러나 코드에는 다른 문제가 있습니다. 입력을 돌연변이시키지 않으므로 포인터 (또는 포인터를 배열)에 대한 포인터를 전달할 필요가 없습니다. 문자열을 복사하려고합니다. 큰. 이를 위해 충분한 양의 메모리를 가리 키도록 초기화 된 char에 대한 포인터 만 있으면됩니다.

미래에 입력을 변경해야하는 경우 (즉, 새 값을 값으로 지정) 포인터를 포인터로 사용하십시오.

int mutate(char **input) 
{ 
    assert(input); 
    *input = malloc(some_size); 
} 

int main(void) 
{ 
    /* p is an uninitialized pointer */ 
    char *p; 
    mutate(&p); 
    /* p now points to a valid chunk of memory */ 
    free(p); 
    return 0; 
} 
+4

C에서 참조로 전달되는 것이 가장 확실합니다. 변수 접두사 앞에 & 기호가 있습니다. – SevenBits

+5

@SevenBits : 아니요, 가장 확실합니다 * 아닙니다 *. '&'연산자의 주소입니다. 참조로 전달하는 것은 soem 변수의 주소를 취하는 것과 같지 않습니다. 나는 누군가가 따라 와서 얼마나 오랜 시간이 걸릴지 궁금해했다. –

+1

나는 여전히 내면화하려고 노력하고 있는데 stringB가 선언 된 것처럼 선언 되었다면 다른 함수에서 돌연변이 될 수있는 방법이 있습니까? – AisIceEyes

0

현재하고 있습니다 :

manipulateStrings(stringA, stringB);

그리고 인쇄를 manipulateStrings 내에서. 대신 올바르게 수행하고 있는지 확인하기 위해 다음을 수행합니다.

manipulateStrings(stringA, stringB); 
printf ("2 string1: %s", string1); 
printf ("2 string2: %s", &string2); 

해당 기능 내에서 인쇄하지 마십시오. 이렇게하면 변수가 값 또는 참조로 복사되는지 테스트 할 수 있습니다.