C++数组指针在结构中保留内存位置但丢失所有值

Thu*_*per 1 c++ arrays struct pointers

我是C++的新手,但有更高级语言的经验.只是想自学.我已经在这个问题上工作了几天(关闭和开启),似乎无法弄清楚这里发生了什么.我知道这是我应该理解的C/C++的基础.问题:

我正在存储一个结构中的数组指针(剥离):

namespace TestSpace {
    struct ArrayData {
        double *data;
        int count;
    };
}
Run Code Online (Sandbox Code Playgroud)

在同一个文件中,我有一个功能:

struct ArrayData *unsorted_5count_duplicates() {
    struct ArrayData *arr;
    double data[] = { 3.5, 1.2, 1.2, 4.0, 3.5 };

    arr = (ArrayData *)calloc(1,sizeof(*arr));

    //I added this line in attempt to fix the problem... no such luck.
    arr->data = (double *)calloc(5,sizeof(double));

    arr->data = data;
    arr->count = 5;

    return arr;
}
Run Code Online (Sandbox Code Playgroud)

在main.cpp中,我调用unsorted_5count_duplicates()并检查所有内容.一旦我将对象传递给AssertCountCorrect(arr),我每次都会得到完全相同的问题:

main.cpp中

TestSpace::ArrayData *arr = TestSpace::unsorted_5count_duplicates();
//During debug, I can check and see *arr has all values set correctly, including the array.
AssertSpace::AssertCountCorrect(arr);
Run Code Online (Sandbox Code Playgroud)

AssertSpace.h

//snippet:
void AssertCountCorrect(struct TestSpace::ArrayData *arr) {
    //I get -9.2559631349317831e+061 every time, for each value of arr->data.
    //   but, the memory reference is correct.
    double *arrdata = arr->data;
    for(int i = 0; i < arr->count; i++) {
        std::cout << *(arrdata + i) << "\n";
    }

}
Run Code Online (Sandbox Code Playgroud)

我已经尝试通过引用传递,使所有const,通过指向数组的指针分配数据...它总是产生相同的结果...一切都检查,直到我将它传递给AssertCountCorrect()函数.

解决方案我实施了

这是一个简单而根本的问题.我需要将数组的所有值复制到结构中,如下所示:

arr->data = (double *)calloc(5,sizeof(double));
for(int i = 0; i < 5; i++) {
    *(arr->data + i) = *(data + i);
}
Run Code Online (Sandbox Code Playgroud)

Sak*_*mar 5

arr = (ArrayData *)calloc(1,sizeof(arr));
Run Code Online (Sandbox Code Playgroud)

成为

arr = (ArrayData *)calloc(1,sizeof(*arr));
Run Code Online (Sandbox Code Playgroud)

要么

arr = (ArrayData *)calloc(1,sizeof(struct ArrayData));
Run Code Online (Sandbox Code Playgroud)

sizeof(arr) 其中arr只是一个指针,它将返回指针的大小,而不是结构类型.


Ben*_*ley 5

除了如 Sakthi 的回答中指出的那样,没有分配正确的内存量之外,您还有另一个问题。二,实际上(至少)。

arr->data = (double *)calloc(5,sizeof(double));
Run Code Online (Sandbox Code Playgroud)

这分配arr->data了一个指针,指向一个动态分配的内存区域。然后,下一行:

arr->data = data;
Run Code Online (Sandbox Code Playgroud)

这是两个问题。首先,它是内存泄漏。您不再可以访问刚刚用 calloc 分配的内存。其次,data是一个本地数组,所以当你arr从函数返回时,arr->data是一个悬空指针。您需要将数据复制过来。标准库中有用于此的函数,例如std::copyor std::memcpy,或者您可以简单地使用 for 循环。

作为旁注,如果您需要一个动态数组,正确的结构通常是std::vector. 我意识到你只是想学习指针,但是一旦你弄清楚了这种情况,就停止使用它们(在大多数情况下)。