2

我正在用 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

看看每个数组的地址是一样的吗?不是很酷,是吗?

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

这是snipplet:(LIST_SIZE = 2 and 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

4

2 回答 2

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");
}

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

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

于 2013-10-24T20:26:53.037 回答
1

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

循环完成后,您的指针都不会指向任何有效的东西。

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

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

您说您想要“指向数组的指针”,但您声明了 of void **pa,它创建pa了一个指向指针的指针。如果你想要pa一个指向数组的指针,你可以这样声明它:

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

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

于 2013-10-24T19:48:23.580 回答