C指针到指针-访问字符串列表

C指针到指针-访问字符串列表,c,pointers,C,Pointers,我试图通过指针访问字符串数组。当内存被分配时,它似乎工作得很好,但是如果我再次尝试迭代指针,这些值就会丢失。但是,指向的地址是正确的 char **rows = (char **) malloc(sizeof(char) * 8); int i; for (i = 0; i < 5; i++) { //first time *(rows + i) = malloc(sizeof(char) * 8); sprintf(*(rows + i), "0x10%d", i);

我试图通过指针访问字符串数组。当内存被分配时,它似乎工作得很好,但是如果我再次尝试迭代指针,这些值就会丢失。但是,指向的地址是正确的

char **rows = (char **) malloc(sizeof(char) * 8);
int i;

for (i = 0; i < 5; i++) { //first time
    *(rows + i) = malloc(sizeof(char) * 8);
    sprintf(*(rows + i), "0x10%d", i);
    printf("---%s@0x%x", *(rows + i), (rows + i));

}

for (i = 0; i < 5; i++) { //second time
    printf("++++%s@0x%x", *(rows + i), (rows + i));
}
这是正确的值和相应的地址。但不知何故,当我再次尝试使用它们时,这些值丢失了,下面是第二个循环的输出:

++++@0x1007e0
++++0@0x1007e8
++++0x102@0x1007f0
++++0x103@0x1007f8
++++0x104@0x100800
很明显,这五个节点的地址都是正确的,但缺少起始节点的值

问题:

为什么地址0x1007e0和地址有效的0x1007e8处缺少值


谢谢,

我认为这可能与您的代码没有为指针分配足够的空间有关:因为您分配的是八个指针,而不是八个字符,所以这一行

char **rows = (char **) malloc(sizeof(char) * 8);
应该是

char **rows = malloc(sizeof(char*) * 8);

进行此更改可以解决问题()。

我想知道您的意思是:
char**rows=(char**)malloc(sizeof(char*)*8)--分配8个字符指针,而不是8个字符。#谢谢,这就是问题所在。我想知道为什么它仍然显示出一些价值观!有什么想法吗?@user2492889这是未定义的行为:崩溃或覆盖不需要发生,如果malloc在分配超出您要求的额外内存方面更慷慨一些,您的程序甚至可以一直工作。尽管您分配的区域太小,无法满足您的需要,内存仍然存在,因此您可以使用它。但由于您不拥有它(应用程序中的其他东西拥有),因此使用它会导致未定义的结果。没有malloc return的强制转换,我个人更喜欢
void*
,因为很容易区分引用的指针大小。@jite我对大小的偏好实际上是
malloc(sizeof(*rows))char*
的身份访问分配,那么它们应该被分配为
malloc(8*sizeof(char*)
。当然,几乎所有平台上的指针都是相同大小的,但这并不是规范所保证的。
(void*)
也可以工作,但可能会分配更多的资源。@leedinelcrocker你说得对,我先把
char*
放在前面,然后快速编辑成
char**
,这当然是不正确的。谢谢
char **rows = malloc(sizeof(char*) * 8);