在循环中生成新数组

时间:2013-10-24 19:37:53

标签: c arrays loops variable-declaration

我正在C中进行一些关于表示多行文本的方法的编程实验。

我提出了四种方法:数组数组,指针数组,数组指针和指针指针。

我遇到了一些数组指针的问题。每次我创建一个数组时,它实际上只是重用我已创建的数组。

查看我的程序中“数组指针”(pa)部分的输出,看看我的意思:

variable    address         value
==========  ==============  =====
pa          0x10f500970

*(pa+0)     0x7fff6f0334bd

*(pa+0)[0]  0x7fff6f0334bd  t
*(pa+0)[1]  0x7fff6f0334be  e
*(pa+0)[2]  0x7fff6f0334bf  s
*(pa+0)[3]  0x7fff6f0334c0  t
*(pa+0)[4]  0x7fff6f0334c1
*(pa+0)[5]  0x7fff6f0334c2  0

*(pa+1)     0x7fff6f0334bd

*(pa+1)[0]  0x7fff6f0334bd  t
*(pa+1)[1]  0x7fff6f0334be  e
*(pa+1)[2]  0x7fff6f0334bf  s
*(pa+1)[3]  0x7fff6f0334c0  t
*(pa+1)[4]  0x7fff6f0334c1
*(pa+1)[5]  0x7fff6f0334c2  1

查看每个阵列的地址是如何相同的?不是很酷,是吗?

所以这是我的问题:有没有办法在n>中实际声明一个新数组? 1循环,而不是重写已存在的数组的内容?

这是snipplet :( LIST_SIZE = 2和TEXT_SIZE = 6)

void** pa = malloc(LIST_SIZE * sizeof(void*));

printh();

printf("pa\t\t%p\n\n", pa);

for(int i = 0; i < LIST_SIZE; i++)
{
  char txt[TEXT_SIZE + 1];

  sprintf(txt, "test %d", i);

  *(pa + i) = txt;

  printf("*(pa+%d)\t\t%p\n\n", i, *(pa + i));

  for(int j = 0; j < TEXT_SIZE; j++){
    printf("*(pa+%d)[%d]\t%p\t%c\n", i, j, &(((char*)*(pa+i))[j]), ((char*)*(pa+i))[j]);
  }

  printf("\n");
}

感谢。如果您有任何其他意见或建议,我也有兴趣听取他们的意见。

完整的源代码位于:https://gist.github.com/80m/7143558

2 个答案:

答案 0 :(得分:1)

变量txtfor循环的本地变量。在每次迭代时,旧的txt变量变为无效,并创建不同的txt实例。这意味着在下一次迭代开始时,上一次迭代中指定为txt的指针未指向有效对象。

当循环结束时,你的指针都没有指向任何有效的东西。

解决此问题的一种方法是为要分配的每个指针动态分配内存。

    pa[i] = malloc(TEXT_SIZE+1);
    snprintf(pa[i], TEXT_SIZE+1, "test %d", i);

你说你想要“指向数组的指针”,但你声明了void **pa,这使得pa成为指针的指针。如果你想要pa指向数组的指针,你可以用这种方式声明它:

char (*pa)[TEXT_SIZE+1] = malloc(LIST_SIZE * sizeof(*pa));

现在,pa[0]将是一个7字节数组,pa[1]将是第二个7字节数组。您不需要在循环中进行任何动态分配。

答案 1 :(得分:1)

每次循环运行 pa 指向相同的 txt 。因此,指针 pa 指向的地址保持不变。如果要将其指向其他位置,请尝试创建不同的char [],例如 txt1 ,并在第二次迭代期间将其分配给(pa + i)

我试过了:

int i=0,j=0;

void** pa = malloc(LIST_SIZE * sizeof(void*));

printf("pa\t\t%p\n\n", pa);

for(i = 0; i < LIST_SIZE; i++)
{

char txt[TEXT_SIZE + 1];
char txt1[TEXT_SIZE + 1];


  sprintf(txt1, "test %d", i);
  sprintf(txt, "test %d", i);
  if (i==0)
  {
    *(pa + i) = txt;
  }
  else
  {
    *(pa + i) = txt1;
  }

  printf("*(pa+%d)\t\t%p\n\n", i, *(pa + i));

  for(j = 0; j < TEXT_SIZE; j++){
    printf("*(pa+%d)[%d]\t%p\t%c\n", i, j, &(((char*)*(pa+i))[j]), ((char*)*(pa+i))[j]);
  }

  printf("\n");
}

并为不同的迭代获得不同的地址。

我认为问题不在于指针,而在于它试图引用的变量,并且每次都保持相同的变量。希望这有帮助!