1

次のコードを実行しようとしていますが、構造体配列の値にアクセスするとガベージ データが返されます。なぜこれが起こっているのですか?どうすれば修正できますか? malloc 部分をメイン関数に移動すると、機能するようです。しかし、malloc を別の関数に保持したいと考えています。

#include <cstdlib>
#include <limits>
#include <iostream>
using namespace std;

/*
 *
 */
typedef struct{
    float x;
    float y;
} CoordinateData;

void tester(CoordinateData* cd_data){
    cd_data = (CoordinateData*)malloc(5*sizeof(CoordinateData));
    CoordinateData data = {41.2525,74.0744};
    *cd_data = data;

}
int main(int argc, char** argv) {

    CoordinateData* cd_data;
    tester(cd_data);
    std::cout << (*cd_data).x << "::" << (*cd_data).y << std::endl;
}

私が得る出力は 2.42126e-39::-1.51015e-05 です 予想される出力は 41.2525::74.0744 です

4

2 に答える 2

3

値ではなくアドレスでcd_data を渡します。

void tester(CoordinateData** cd_data)
{
    *cd_data = (CoordinateData*)malloc(5*sizeof(CoordinateData));
    CoordinateData data = {41.2525,74.0744};
    *(*cd_data) = data;
}

int main(int argc, char** argv)
{
    CoordinateData* cd_data = NULL;
    tester(&cd_data);
    std::cout << (*cd_data).x << "::" << (*cd_data).y << std::endl;
    free(cd_data);
    return EXIT_SUCCESS
}

main()また、欠落していた戻り値にも注意してください。また。この質問は、C と C++ の両方としてタグ付けされています。後者の場合は、and の代わりに and を使用newdelete[]ますmallocfree

于 2012-11-28T06:31:29.960 に答える
2

malloc関数に渡すポインタのコピーにメモリを割り当てるためです。
関数に渡すポインターには、メモリやデータが割り当てられることはありません。

参照渡しする必要があります。

//Call function as
tester(&cd_data);

//Function Implementation
void tester(CoordinateData** cd_data)
{
    *cd_data = (CoordinateData*)malloc(5*sizeof(CoordinateData));
    CoordinateData data = {41.2525,74.0744};
    *(*cd_data) = data;
}
于 2012-11-28T06:30:37.213 に答える