我正在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
答案 0 :(得分:1)
变量txt
是for
循环的本地变量。在每次迭代时,旧的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");
}
并为不同的迭代获得不同的地址。
我认为问题不在于指针,而在于它试图引用的变量,并且每次都保持相同的变量。希望这有帮助!