0

配列インデックス 0 ~ 499 の文字列「$1」~「$500」を含むように「sval」を取得しようとしています。次のコードでは、しかし、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;
        }
    }

itoa も減価償却されているようですが、int を string にググったときに得たものです。

4

1 に答える 1

3

は必要ありませんltoacout問題ありません。数値とその文字列表現を配列に保持する必要があるのはなぜですか? 出力で「10」を取得すると、独自の変換は必要ありませcout << 10

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

と:

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

いいえ、必要ないだけでなく、まったく存在しないはずです! C++ の場合 - and を使用newdeleteないmallocでください。これは C 関数です。

于 2012-04-10T06:06:55.810 に答える