我是c++
的初学者..所以请帮助我做对。
尝试从集合中读取,在我尝试的一个版本的实现中,有一些来自控制台的调整,另一个测试..显示数字,所以它可能是指向字符串的指针......
代码如下
DataCollection.h
typedef struct _DataC
{
char* buffer;
UINT Id;
} DataC;
void GetDataC( int ArrSize, DataC** DArr );
DataCollection.cpp
#include "DataCollection.h"
void GetDataC( int ArrSize, DataC** DArr )
{
int count = 0;
int strSize = 10;
*DArr = (DataC*)CoTaskMemAlloc( ArrSize * sizeof(DataC));
DataC* CurData = *DArr;
char TestS[] = "SomeText00";
for ( int count = 0; count < ArrSize; count++,CurData++ )
{
TestS[strSize-1] = count + '0';
CurData->Id = count;
CurData->buffer = (char*)malloc(sizeof(char)*strSize);
strcpy(CurData->buffer, TestS);
}
}
测试集合:
int main(void)
{
StpWatch Stw;long ResSw;
DataC* TestDataArr;// maybe use DataC TestDataArr[] instead...
GetDataC(100000, &TestDataArr);
}
如何在循环中阅读集合?
...为
std::cout<<TestDataArr[count].buffer<<std::endl;
或?
std::cout<<TestDataArr->buffer<<std::endl;
读取循环中每个元素的正确实现是什么?
谢谢你的时间。答案 0 :(得分:1)
问题出在TestS[strSize-1] = count + '0';
。当您通过ArrSize == 100 0000
然后在for
循环中,某个时刻的count + '0'
值超出char
的范围,您将获得[0-31]
范围内的字符值}(不可打印的字符)。至少使用
TestS[strSize-1] = '0' + count % (126 - '0');
TestS
的最后一个字符将在[48-126]范围内更改(ASCII可打印字符)。
答案 1 :(得分:1)
DataC* TestDataArr
和DataC TestDataArr[]
是一回事。也就是说,当您尝试引用TestDataArr时,您可以执行以下两项操作之一:
TestDataArr[index].buffer
或
(TestDataArr + index)->buffer
因为TestDataArr
是一个指针,你必须在使用它的任何成员之前遵守它,这就是索引的作用。使用第一种方法作为数组索引,指针在数组中的index
处取消引用,然后您可以使用.
来访问对象的成员。第二种方法index
将指针前进到内存位置但不取消引用指针,因此必须使用->
来访问其成员。
因此,要在循环中打印缓冲区,您可以使用:
std::cout << TestDataArr[count].buffer << std::endl;
或
std::cout << (TestDataArr + count)->buffer << std::endl;
你提到的昙花一现可能是因为TestS[strSize-1] = count + '0';
count + '0'
创建了一个超出ASCII范围的字符。其中一些字符会导致控制台发出哔声。