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)
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只是一个指针,它将返回指针的大小,而不是结构类型.
除了如 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. 我意识到你只是想学习指针,但是一旦你弄清楚了这种情况,就停止使用它们(在大多数情况下)。
| 归档时间: |
|
| 查看次数: |
1086 次 |
| 最近记录: |