【问题标题】:Array over written with last value assigned?用分配的最后一个值覆盖数组?
【发布时间】:2010-09-29 22:52:12
【问题描述】:

我有一个指向指针数组的指针。我在下面的 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);

【问题讨论】:

  • 那么很可能是你取出了导致问题的错误代码,我建议你把它放回去,以便我们帮助你。

标签: c++ arrays pointers


【解决方案1】:

您应该创建一些可以实际编译和重现问题的东西。它不仅会帮助人们帮助您,而且这样做您很可能会自己发现问题。

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

  • 什么是 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");
}


}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您如何填充 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 没有保留数据的副本,它都指向同一个位置。

      【讨论】:

        【解决方案4】:

        好吧,从我现在所看到的情况来看,您在最后一个“双重”信息中基本上在 r+2 处终止了您的 tableData。此外,如果您在 printf'ing 时执行了 tableData[0][1] 或 tableData[0][2],它可能会更清晰一些(可能只是对我而言)。这种方式更清楚地表明 tableData 是 2 的“结构”的索引,每个结构都包含一个以 NULL 结尾的字符串。这也可能有助于您的调试...

        【讨论】:

          【解决方案5】:

          然后试试这个调试:

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

          可能是你取出的错误?

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              猜你喜欢
              • 2013-10-03
              • 2020-11-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-08-20
              • 1970-01-01
              相关资源
              最近更新 更多