【发布时间】:2019-07-30 00:23:10
【问题描述】:
为了理解 void 指针是如何工作的,我写了一段代码来测试它。但是,我在运行时遇到了分段错误,并且不知道如何处理它。这里的关键点是,数据是在该函数调用内部生成的。您不知道数据类型以及应该分配的 void 指针有多大。
#include <iostream>
#include <vector>
int valueAssignment(void *ptr1, void *ptr2){
std::vector<int> vi;
std::vector<double> vb;
int num = 10;
for (size_t i = 0; i < num; i++) {
vi.push_back((int)rand());
vb.push_back((double)rand());
std::cerr <<i<<": "<< vi[i] <<'\t'<<vb[i]<<'\n';
}
for (size_t i = 0; i < num; i++) ((int*)ptr1)[i] = vi[i];
for (size_t i = 0; i < num; i++) ((double*) ptr2)[i] = vb[i];
return num;
}
int main(int argc, char const *argv[]) {
void * intPtr, *doublePtr;
int size;
size = valueAssignment(intPtr,doublePtr);
std::cerr << "/* ------------------- */" << '\n';
for (size_t i = 0; i < size; i++) {
std::cout <<i<<": "<< ((int*)intPtr)[i]<<"," <<((double *)doublePtr)[i]<<std::endl;
}
return 0;
}
【问题讨论】:
-
你需要让这些指针指向有效的内存位置。
-
size = valueAssignment(intPtr,doublePtr);--intPtr和doublePtr未初始化,因此这永远无法工作。 -
在您尝试了解 void 指针之前,请练习使用类型指针,例如
int*如果你不能使用直接的指针,你得到 void 指针的机会很小。它们主要用于“我实际上知道得更好”的情况。 -
"为了理解 void 指针是如何工作的......" 你可能应该阅读good book。
标签: c++ pointers pass-by-reference void