2012-04-10 22 views
0

配列インデックス0-499の文字列 "$ 1" - "$ 500"を含むように 'sval'を取得しようとしています。次のコードでは、しかし、itoaは私に以下のコードで奇妙な文字列を与えている:また、itoaは減価償却されているようだint to string、char * itoa

#include<iostream> 
    #include <stdio.h> 
    #include <stdlib.h> 
    using namespace std; 


    typedef struct data_t { 
     int ival; 
     char *sval; 
    } data_t; 

    void f1(data_t **d); 
    int main() 
    { 
    data_t *d; 

     d=static_cast<data_t*>(malloc(500)); //is this even needed? 
     d = new data_t[500]; 
     f1(&d); 
    } 

    /* code for function f1 to fill in array begins */ 
    void f1(data_t **d) 
    { 
     int i; 
     char str[5]; 
     for (int i=0; i<500; i++) 
     { 
      (*d)[i].ival=i+1; 
      itoa (i,str,10); 
      (*d)[i].sval= str; 
     } 
    } 

を、それは、私は、文字列

+0

なぜですか?なぜ?** d' ?????ちょうどあなたが '(* d)[i]'をすることができるように?本当に?! – littleadv

+1

'std :: string'を使うだけです。 –

+0

'malloc'と' new'の両方を使うべきではありません。ちなみに、 'malloc'は' sizeof(data_t)* 500'で '500 'ではなく呼び出されるべきです。しかし、C++で 'malloc'を使用しないでください.Cとの互換性のためにしか使用できませんでした。 – vsz

答えて

3

あなたドンにint型をGoogleで検索するとき、私が得たものでしたltoacoutが必要です。なぜ配列の数値とその文字列表現を保持する必要がありますか? cout << 10を入力すると出力に「10」が表示されますが、自分でコンバートする必要はありません

一方、ltoaは文字列にメモリを割り当てずに行いますが、あなたは健康ではありませんおそらく気づいたでしょう。関数を終了した後にアクセスしようとするローカル変数(すべての500の配列メンバで同じ)を使用します。これは、大きな問題ではない、未定義の動作です。

そして:

d=static_cast<data_t*>(malloc(500)); //is this even needed? 
    d = new data_t[500]; 

番号だけでなく、必要でない - まったく存在しないはずです! C++の場合、newdeleteを使用してください。決してmallocというCの関数です。

+0

mallocに関する情報をありがとう。 "$ 1" - "$ 500"をsvalに入れようとしたら、どうしたらよいでしょうか? – Sun

+0

私はそれをしないことをお勧めします。絶対に必要な場合は、 'std :: string'を使用し、' char'の配列は使用しないでください。配列を使用することが絶対に必要な場合は、実際にそれらのためにいくつかのメモリを割り当ててください。 – littleadv

+0

あなたが配列のメモリを割り当てると言うとき、以下のコードが悪いです(グローバル変数a nonoを推測しますか?)、どこに割り振りますか? さらに、sval = $ 1- $ 500を取得する最も簡単な方法は何ですか? – Sun