>

char *를 함수에 전달하면 그런 다음 char을 가져 와서 std :: string으로 변환하고 결과를 얻은 후에 std :: string에서 char *로 다시 변환하여 결과를 표시합니다.

<올>
  • 전환을 위해이 작업을 수행하는 방법을 모르겠습니다 (const char *가 아니라 char * 만 말하고 있습니다)
  • 내가 보낸 포인터의 값을 조작하는 방법을 잘 모르겠습니다.
  • 따라야 할 단계

    <올>
  • 숯불 먹기 *
  • 문자열로 변환
  • 문자열의 결과를 가져 와서 문자 형태로 다시 넣습니다. *
  • 값을 함수 외부에서 사용할 수 있고 파괴되지 않도록 결과를 반환합니다.
  • 가능한 경우 참조 대 포인터를 통해 어떻게 수행 될 수 있는지 볼 수 있습니까 (주소로 값을 전달하지만 포인터가 가리키는 값을 여전히 수정할 수 있습니다. 그래서 포인터 주소의 사본이 함수가 파괴되었지만 여전히 변경된 값을 외부에서 볼 수 있습니다.

    감사합니다!


    • 답변 # 1

      char* 변환   std::string 에 :

      char* c = "Hello, world";
      std::string s(c);
      
      

      std::string 변환   char* 에 :

      std::string s = "Hello, world";
      char* c = new char[s.length() + 1];
      strcpy(c, s.c_str());
      // and then later on, when you are done with the `char*`:
      delete[] c;
      
      

      나는 std::vector<char> 를 사용하는 것을 선호합니다  실제 char* 대신 ;자신의 메모리를 관리 할 필요가 없습니다 :

      std::string s = "Hello, world";
      std::vector<char> v(s.begin(), s.end());
      v.push_back('\0'); // Make sure we are null-terminated
      char* c = &v[0];
      
      

    • 답변 # 2

      귀하가 반환하는 포인터에서 메모리를 처리하는 방법을 관찰해야합니다. 예를 들어 fn ()이 종료되면 std :: string에 할당 된 메모리가 해제되므로 아래 코드는 작동하지 않습니다.

      const char* fn(const char*psz) {
          std::string s(psz);
          // do something with s
          return s.c_str();   //BAD
      }
      
      

      하나의 해결책은 함수에 메모리를 할당하고 함수의 호출자가 메모리를 해제하도록하는 것입니다 :

      const char* fn(const char*psz) {
          std::string s(psz);
          // do something with s
          char *ret = new char[s.size()]; //memory allocated
          strcpy(ret, s.c_str());
          return ret;
      }
      ....
      const char* p = fn("some text");
      //do something with p
      delete[] p;// release the array of chars
      
      
      또는 문자열 크기의 상한을 아는 경우 스택에서 직접 만들고 포인터를 전달할 수 있습니다 (예 :

      void fn(const char*in size_t bufsize, char* out) { 
          std::string s(psz);
          // do something with s
          strcpy_s(out, bufsize, s.c_str()); //strcpy_s is a microsoft specific safe str copy
      }
      ....
      const int BUFSIZE = 100;
      char  str[BUFSIZE];
      fn("some text", BUFSIZE, str);
      //ok to use str (memory gets deleted when it goes out of scope)
      
      

    • 답변 # 3

      라이브러리의 가비지 수집기를 유지 관리 할 수 ​​있습니다. 와이즈 비즈  라이브러리 'lib'에서 액세스 할 수 있습니다. 나중에 std::vector<char*> g_gc; 를 호출하여 편리하게 g_gc의 모든 포인터를 해제 할 수 있습니다

      lib::release_garbage();
      
      

      release_garbage 함수는 다음과 같습니다 :

      char* lib::func(char*pStr)
      {
        std::string str(pStr);
        char *outStr = new char[str.size()+1];
        strcpy(outStr, str.c_str());
        g_gc.push_back(outStr); // collect garbage
        return outStr;
      }
      
      
      단일 스레드 모델에서는이 g_gc를 정적으로 유지할 수 있습니다. 다중 스레드 모델에는 잠금/잠금 해제가 포함됩니다.

      void lib::release_garbage() { for(int i=0;i<g_gc.size();i++) { delete g_gc[i]; } g_gc.clear(); }

  • 이전 audio - 파이썬에서 사인파 사운드 생성
  • 다음 로드 테스트를 위해 빠른 소켓 작성 및 소멸을 시도 할 때"javanetbindexception - 이미 사용중인 주소"