我有一个指向指针数组的指针。我在下面的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);
答案 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)
您应该创建实际编译并重现问题的内容。它不仅可以帮助人们帮助你,而且在这样做时你很可能会自己找到问题。
在您的代码摘录中,我们不知道:
我根据你发布的内容创建了这个代码,它从两个循环产生相同的输出。所以要么我错过了你所发布的内容,要么就是你留下了重要的东西。
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)
是的,所有人都指向了最后一个值。我继续为每个项目分配了内存空间,并相应地指向每个项目。