我有一个功能:
int getDBVal(UCHAR *myData[MAX_RECORDS], int &numRecords);
我称之为:
int main()
{
int rc;
int NumRecords = 0;
UCHAR *myData[MAX_RECORDS];
rc = getDBVal(myData, numRecords)
for (int i=0; i<numRecords; i++)
{
printf("Queue Name: %s\n", myData[i];
}
}
该函数从数据库中获取记录,并且应该返回它们
{
SQLFetch
printf("Received %s\n", dataStruct[0].charCol);
myData[y] = dataStruct[0].charCol);
numRecords++;
y++;
}
输出结果为:
Received queue1
Received queue2
Received queue3
Queue Name queue3
Queue Name queue3
Queue Name queue3
为什么最后一个响应被复制到所有3个调用程序数组位置?
答案 0 :(得分:0)
dataStruct[0].charCol
看起来您正在为每个值设置索引0的值。我不知道dataStruct或y来自哪里,因为该代码未发布。
答案 1 :(得分:0)
看起来dataStruct[]
是每次调用以获取新行时被覆盖的内容。您正在将dataStruct[0].charCol
的指针保存到myData
数组的每个索引中 - 而不是将文本复制出来。由于每个myData
条目都有一个指向同一位置的指针,因此您将获得上次存储在该结构中的值。
我还要确保dataStruct[]
在尝试通过存储在myData
中的指针打印内容时不会超出范围 - 这会调用未定义的行为。但是这里没有足够的代码来猜测......
答案 2 :(得分:0)
变量myData[y]
都指向dataStruct[0].charCol
的地址。要获得所需的行为,您需要深层复制。您需要在myData[y]
分配足够的内存,并复制dataStruct[0].charCol
指向新分配的内存的字符。完成后,您还需要记住释放内存。
为了让您的生活更轻松,请使用string
s:std::vector<std::string> myData(MAX_RECORDS);
数组。您甚至不需要指定数组的大小,因为push_back
并且向量将增长:std::vector<std::string> myData;
。