从自定义集合中读取数据(struct Array)

时间:2015-10-22 18:58:01

标签: c++ performance pointers collections

我是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;

读取循环中每个元素的正确实现是什么?

谢谢你的时间。

2 个答案:

答案 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* TestDataArrDataC 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范围的字符。其中一些字符会导致控制台发出哔声。