-2

私はこのようないくつかの機能を持っています:

void MClass::GetS(char* buf, int max) const  {
char *temp = new char[max];
temp[max] = '\0';
for (int i = 0; i < max - 1; i++)
    temp[i] = src[i]; // src is class member (char *)
buf = temp; // buf is null after this o.O
}

そのため、この関数でbuf値を変更することはできません。なぜそれが起こるのですか?

4

4 に答える 4

3

関数に渡すchar *と、その関数へのポインターのコピーが渡されます。ポインタが値によって渡されると考えることができます。このコピーされたポインタを変更しても、元のポインタは変更されません。

参照(ポインタへの参照)で渡す必要があります:

void MClass::GetS(char *&buf, int max) const

またはポインター(ポインターからポインター):

void MClass::GetS(char **buf, int max) const

またはポインタを返します:

char *MClass::GetS(int max) const
于 2013-01-31T22:06:04.147 に答える
0

問題:

  1. ヒープ配列の最後を次のように書き留めていますtemp[max] = '\0';。これにより、バッファの後に01スポットが配置されます。

  2. srcがどれほど大きいか誰が知っていますか。あなたは「最大」を渡し、サイズをチェックせずにsrcに対して読み取っています-非常に危険です。

  3. ポインタ付きのポインタを返しています。ダブルポインタを渡して、実際のポインタ値が正しく返されるようにする(またはreturnステートメントでポインタを返す)必要があります。

疑わしい場合は、デバッガーでコードをトレースします。私の推測では、コンパイラは最後の割り当てを最適化し、それをNULLのままにしておくことであなたを助けていると思います-その後、壊れたヒープとメモリリークで後で陽気にクラッシュすることができます...

于 2013-01-31T22:10:50.310 に答える
0

これは明らかに宿題の問題です。

bufサイズのバッファが渡されていると思いますmax。あなたは必要ではありませんtemp、そしてあなたは終わりを書き留めないように非常に注意するべきです。何かのようなもの...

void MClass::GetS(char* buf, int max) const  {
  if(!buf) {
    return;
  }

  for (int i = 0; i < max - 1; i++) {
      buf[i] = src[i]; // How long is `src`?
  }
}

これは最新のC++ではなく、自分でこれを行っている場合、関数は次のように宣言されます(終了したとstd::string MClass::GetS() const { return src; }仮定)。先生を訂正してください。srcnull

于 2013-01-31T22:11:12.587 に答える
0

配列を超えた要素を参照しているため(MAX要素があり、インデックスが開始して0であるため)、UB/Errorです。文字配列には、ヌル文字btwに対して常に1つの追加文字が必要です。

srcとは何かに関する詳細情報も役立ちます。

ただし、この場合、渡した値を返したり変更したりせずに、(パラメーターとして)bufの値を変更していることがわかります。

単純なポインターだけでなく、ポインターへのポインターまたはポインター(* )または( &)への参照を渡す必要があります。

于 2013-01-31T22:05:05.713 に答える