写入的数组是否分配了最后一个值?

时间:2009-01-07 01:41:15

标签: c++ arrays pointers

我有一个指向指针数组的指针。我在下面的while循环中分配每一行,而while循环中的printf显示每个都分配了我的ID号1-20。
之后,在while循环的一侧,我迭代遍历数组,每个元素写入id 20?
任何帮助是极大的赞赏。 (仅供参考 - 我使用的是Template2doc库和example1.c,位于底部 - http://www.algonet.se/~thunberg/template2doc/c_version/docs/index.htm

下面的代码只显示问题区域,我拿出了其余部分。

    char **tableData[500]={NULL};         
    char *myData[500][2]; 


while(rc == SQLITE_ROW){
    tableData[r] = myData[r];
    printf(*tableData[r]); <-- Displays id 1-20 fine
    r=r+1;
}//end while 

tableData[r+1] = NULL;//null terminated array

for (a=0; a<r; a++){
    printf("\n");
    printf(*tableData[a]);  <--Displays 20 elements all of id 20?
}


outputFile=insertTableData(outputFile, dataMarker, fieldMarker, tableData);

6 个答案:

答案 0 :(得分:2)

正如所指出的,你在r + 2位置指定Null。你是否以任何方式在while和for循环之间修改tableData或myData?

答案 1 :(得分:2)

你如何填充myData?我没有在给出的代码示例中看到明显的错误,但我怀疑问题是你在myData中指定一个缓冲区而没有实际复制内容,所以myData [0 .. r]都指向相同的缓冲区,只存储最近读取的值。试试这个:

while(rc == SQLITE_ROW){
        tableData[r] = myData[r];
        if (r > 0)
            printf(*tableData[r-1]);
        r=r+1;
}//end while 

这应该打印从1到19罚款的ID。如果它从id 2而不是id 1开始,那表明myData没有保留数据的副本,它们都指向同一个位置。

答案 2 :(得分:2)

您应该创建实际编译并重现问题的内容。它不仅可以帮助人们帮助你,而且在这样做时你很可能会自己找到问题。

在您的代码摘录中,我们不知道:

  • rc是什么,它的值是如何设置的,或者它的值如何变化并因此终止循环
  • r的初始值是
  • myData的实际内容是

我根据你发布的内容创建了这个代码,它从两个循环产生相同的输出。所以要么我错过了你所发布的内容,要么就是你留下了重要的东西。

int main( int argc, char** argv ) {

#define STRING  char *

STRING  dummy = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()";

STRING *tableData[500]={0};         
STRING myData[500][2];

int r=0;

while(r < 20){
        myData[r][0] = dummy+2*r;
        myData[r][1] = dummy+r;
        tableData[r] = myData[r];
        printf(*tableData[r]);
        printf("\n");
        r=r+1;
}//end while 

int a;

for (a=0; a<r; a++){
        printf(*tableData[a]);
        printf("\n");
}


}

答案 3 :(得分:1)

从我现在看到的情况来看,你从最后一次“重复”的信息中基本上以r + 2结束你的tableData。另外,如果你在printf'ing中执行tableData [0] [1]或tableData [0] [2],它可能会更清晰一点(也许只适合我)。这种情况更清楚表明tableData是2的“结构”的索引,每个都包含一个以NULL结尾的字符串。这也可能对你的调试有帮助......

答案 4 :(得分:1)

尝试使用它进行调试:

printf("Character at 0x%x : %d", tableData[a], *tableData[a]);

可能是你拿出来的错误?

答案 5 :(得分:0)

是的,所有人都指向了最后一个值。我继续为每个项目分配了内存空间,并相应地指向每个项目。