为了完成前一个有效的答案,我会尽力扩大了答案:
Have I done it correctly?
好了,为了传递数据函数之间:是的,用指针来做是一个选项。但社区普遍不鼓励它,因为这会让内存管理变得麻烦。
当您使用指向动态内存的指针时,必须清楚地知道WHERE内存被创建以及内存将被删除的位置,换句话说:内存的生命周期必须清晰直接,出于这个原因,通常不鼓励在函数之间传递指针。
例如,在你的案例:unsigned int* step1(...)
函数返回一个指针,但看着它,一个新的程序员或者有人说,你的工作就不会告诉我们,如果返回的指针是动态内存,如果调用第一步必须delete
或delete []
通话后的记忆,unsigned char* step2(unsigned int* savedData, ...)
也一样,会更混乱和麻烦,因为有人会问:step2
会改变savedData
通过?
为了解决step2
问题,您可以将功能更改为:
unsigned char* step2(const unsigned int* const savedData, ...)
通过添加const
你告诉:“嘿step2
是不会改变的savedData
的内容,也不!改变它指向的地址“。
但以前的所有文本都没用,因为没有解决最重要的问题:内存何时被释放?
在step1
中,您正在动态创建内存,在step2
这个内存得到了补充,但是... delete
隐藏在您不粘贴的代码中的某个地方?或者有一个step3
等待照顾内存?
为了避免这一切的内存头痛,通常建议使用STL容器,如std::vector
,容器会照顾的内存管理的你,你的情况:
typedef std::vector<int> intvector;
typedef std::vector<intvector> intintvector;
void step1(intintvector &Data, ...) {
...
// create data arrays
intvector data0, data1, data2, data3;
// fill data0, data1, data2, data3
// ...
// save data arrays.
Data.push_back(data0);
Data.push_back(data1);
Data.push_back(data2);
Data.push_back(data3);
}
void step2(const intintvector &savedData, ...) {
// read data arrays
intvector data0 = savedData[0];
intvector data1 = savedData[1];
intvector data2 = savedData[2];
intvector data3 = savedData[3];
// ...
}
在小结:如果您不处理动态内存,则不能正确使用指针部分,因此,您必须解决此问题或委托给STL容器。
希望它有帮助! :D
'4个函数之间的数组'你没有4个数组。你有1个包含4个元素的数组。 –
不,data0-4是在函数中动态分配的实际数组。 –
我推荐阅读一些[C++书籍](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)。 –