source

함수에서 char[]/string을 반환합니다.

goodcode 2022. 8. 20. 19:01
반응형

함수에서 char[]/string을 반환합니다.

나는 C에서 코딩하는 것을 매우 처음이며, 현재 c 문자열/char 배열을 반환하는 함수를 만들고 변수에 할당하려고 합니다.

지금까지 char *를 반환하는 것이 가장 일반적인 해결책이라는 것을 알게 되었습니다.그래서 나는 시도했다:

char* createStr() {
    char char1= 'm';
    char char2= 'y';
    char str[3];
    str[0] = char1;
    str[1] = char2;
    str[2] = '\0';
    char* cp = str;
    return cp;
}

문제는 반품된 이 제품을 어떻게 사용하는가입니다.char*char [ ]변수에 char 배열을 할당할 수 있습니까?

시도했습니다(모두 noob-drowning 오류로 이어졌습니다).

  1. char* charP = createStr();
  2. char myStr[3] = &createStr();
  3. char* charP = *createStr();

변수를 동적으로 할당하지 않는다는 점에 유의하십시오. 즉, 내부 데이터는str이 기능은 기능이 종료될 때까지 손실됩니다.

다음 사항이 필요합니다.

char * createStr() {

    char char1= 'm';
    char char2= 'y';

    char *str = malloc(3);
    str[0] = char1;
    str[1] = char2;
    str[2] = '\0';

    return str;

}

그런 다음 함수를 호출할 때 데이터를 수신할 변수의 유형이 함수 반환의 유형과 일치해야 합니다.따라서 다음 사항이 필요합니다.

char *returned_str = createStr();

메모리 누수를 방지하기 위해 반환된 값을 해방해야 합니다.

char *returned_str = createStr();

//doSomething
...

free(returned_str);

반환할 경우char*함수에서, 반드시malloc()스택 초기화 문자 배열은 함수에서 돌아온 후 액세스하는 것은 정의되지 않은 동작이기 때문에 반환에 의미가 없습니다.

로 변경하다

char* createStr() {
    char char1= 'm';
    char char2= 'y';
    char *str = malloc(3 * sizeof(char));
    if(str == NULL) return NULL;
    str[0] = char1;
    str[1] = char2;
    str[2] = '\0';
    return str;
}

기능이 종료되었을 때 어레이가 손실되지 않도록 하려면 , 다음의 방법으로 스태틱 어레이를 사용할 수 있습니다.

char * createStr() 
{
    char char1= 'm';
    char char2= 'y';

    static char str[3];  
    str[0] = char1;
    str[1] = char2;
    str[2] = '\0';

    return str;
}

Edit : Toby Speight가 언급했듯이 이 접근법은 스레드 세이프가 아닙니다.또한 함수를 호출하면 일부 응용 프로그램에서 불필요한 데이터 덮어쓰기가 발생합니다.따라서 함수에서 돌아오는 즉시 데이터를 버퍼에 저장해야 합니다.(단, 스레드 세이프 방식이 아니기 때문에 동시 콜이 문제가 되는 경우가 있습니다.이를 방지하려면 lock을 사용해야 합니다.함수 입력 시 캡처하고 복사가 완료된 후 해제해야 합니다.따라서 이 접근법은 사용하지 않는 것이 좋습니다.)

char* charP = createStr();

당신의 기능이 정확하다면 정확할 것입니다.안타깝게도 함수의 로컬 변수에 포인터를 반환하고 있습니다. 즉, 함수가 반환되는 즉시 해당 포인터가 정의되지 않은 데이터에 대한 포인터입니다.반환하는 포인터가 의미를 가지려면 함수 문자열에 malloc과 같은 힙 할당을 사용해야 합니다.그럼 나중에 풀어야 한다는 걸 잊지 마세요.

'string'도 포함해서h"를 사용하면 일이 쉬워집니다.보다 쉬운 문제 해결 방법은 다음과 같습니다.

#include <string.h>
    char* createStr(){
    static char str[20] = "my";
    return str;
}
int main(){
    char a[20];
    strcpy(a,createStr()); //this will copy the returned value of createStr() into a[]
    printf("%s",a);
    return 0;
}

언급URL : https://stackoverflow.com/questions/14416759/return-char-string-from-a-function

반응형