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

read data from a custom collection (struct Array)

本文关键字:读取 数据 Array struct 自定义 集合      更新时间:2023-10-16

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

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

感谢您的宝贵时间。

DataC* TestDataArrDataC TestDataArr[]是一回事。也就是说,当您尝试引用TestDataArr时,您可能会做以下两件事之一:

TestDataArr[index].buffer

(TestDataArr + index)->buffer

因为TestDataArr是一个指针,你必须在使用它的任何成员之前遵从它,这就是index所做的。使用第一种方法,作为数组索引,指针在数组的index处解引用,然后您可以使用.访问对象的成员。第二种方法是index,它将指针推进到内存位置,但不会对指针进行解引用,因此必须使用->才能访问其成员。

因此,要在循环中打印缓冲区,可以使用以下两种方法:

std::cout << TestDataArr[count].buffer << std::endl;

std::cout << (TestDataArr + count)->buffer << std::endl;

您提到的闪烁可能是因为TestS[strSize-1] = count + '0';,其中count + '0'创建了ASCII范围之外的字符。

问题在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可打印字符)范围内更改。