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