1

我正在尝试运行以下代码,但它在访问结构数组值时为我提供了垃圾数据。为什么会发生这种情况,我该如何解决?一旦我将 malloc 部分移动到 main 函数,它似乎就可以工作了。但我想将 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++。如果是后者,请使用newanddelete[]代替mallocandfree

于 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 回答