아하
검색 이미지
생활꿀팁 이미지
생활꿀팁생활
생활꿀팁 이미지
생활꿀팁생활
청초한파리217
청초한파리21719.03.07

C언어에서 함수에 파라미터가 char **일떄..

C언어에서

함수가 callFunc(char **) 이런식으로 선언되어있을때

메인함수에서

int main()

{

char *c1;

callFunc(&c1);

printf("%s", c1);

return 0;

}

이런식으로 함수를 호출하면 쓰레기 값이 나오는데...

함수의 파라미터가 더블포인터인 경우 저값을 어떤식으로 매핑해야 할가요??

55글자 더 채워주세요.
답변의 개수
1개의 답변이 있어요!
  • 현재 궁금한 것이 두가지 있습니다.

    char* c1;

    callFunc(&c1);

    여기서 c1은 callFunc에서 메모리 할당을 하는 객체 인가요? 아니면 callFunc에서 할당된 메모리의 포인트를 받는 Output 인가요?

    1.메모리 할당을 callFunc에서 한다고 가정하면

    메모리 할당 및 0으로 메모리 초기화 과정을 거쳐 데이터의 끝을 알려줘야 합니다.

    다음 어떠한 문자열이나 데이터를 넣는 과정을 거친 후, callFunc 가 끝이나도 메모리가 힙 영역에 살아있도록 합니다.

    다음 printf는 동일하게 해도 문자열 데이터를 볼 수 있습니다.

    그리고 마지막으로 메모리를 해제해야 합니다.

    2.메모리 할당된 포인터를 가져오는 경우, 위와 마찬가지로 메모리가 힙영역에 할당된 다른 메모리 포인터(p1)를 생성해야 합니다.

    기본적으로 모든 지역함수는 함수 종료와 함께 사라지기 때문에 힙영역에 할당해야 해제되기 전까지 살아있습니다.

    다음 callFunc 내부에서 문자열 처리가 끝난 p1의 주소를 callFunc로 넘긴 c1의 주소에 Assign 합니다.

    위와 동일하게 문자열 데이터를 볼 수 있고, 마지막으로 해제하면 메모리 릭이 없습니다.

    void callFunc(char** ppStr)

    {

    *ppStr = new char[256]; // C++ 메모리 할당

    memset(*ppStr, 0, 256); // 메모리 0으로 초기화

    for(int i = 0; i < 10; ++i)

    *(*(ppStr) + i) = 65 + i;

    }

    int main()

    {

    char* pC1 = nullptr; // 메모리 NULL 초기화

    callFunc(&pC1);

    printf("%s", pC1);

    if(pC1) // 메모리 할당에 성공한 경우

    delete[] pC1; // C++ 메모리 해제

    pC1 = nullptr; // 사용해도 되고 안해도 되지만 재사용이 되는 경우에는 넣어두면 좋아요

    return 0;

    }