通过引用将字符数组传递给函数

时间:2014-07-29 15:26:41

标签: c++ sql arrays pointers

我有一个功能:

 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个调用程序数组位置?

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;