在我(重新)学习C的阶段,我经常遇到数组和结构(和指针)的问题。这是我写的一个小测试。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct {
char name[10];
} man;
int main (int argc, const char * argv[]) {
int i;
man john;
strcpy(john.name, "john");
// array of structures
man men[10];
strcpy(men[3].name, "john");
printf("*** %s ***\n", men[3].name);
// dynamic array of structures
man *men2;
men2 = malloc(10 * sizeof(man));
strcpy(men2[3].name, "john");
printf("*** %s ***\n", men2[3].name);
// multidimensional array of structures
man men3[10][10];
strcpy(men3[3][3].name, "john");
printf("*** %s ***\n", men3[3][3].name);
// dynamic multidimensional array of structures
man **men4;
men4 = malloc(10 * sizeof(man*));
for (i = 0; i < 10; i++)
men4[i] = malloc(10 * sizeof(man*));
strcpy(men4[3][3].name, "john");
printf("*** %s ***\n", men4[3][3].name);
// array of pointer to structure
man *men5[10];
men5[3] = &john;
printf("*** %s ***\n", men5[3]->name);
// dynamic array of pointers to structure
man **men6;
men6 = malloc(10 * sizeof(*men6));
men6[3] = &john;
printf("*** %s ***\n", men6[3]->name);
// dynamic multidimensional array of pointers to structures
/* ? */
return 0;
}
你可以:
sizeof(man*)
但在men6中它是sizeof(*men6)
(星号位置)提前致谢。
答案 0 :(得分:1)
sizeof(*men6) == sizeof(man*)
!man ***men4; // 10x10 multidimensional
men4 = malloc(10 * sizeof(man**));
for (i = 0; i < 10; i++)
{
men4[i] = malloc(10 * sizeof(man*));
for(j = 0; j < 10; ++j)
men4[i][j] = malloc(sizeof(man));
}
strcpy(men4[3][3]->name, "john");
printf("*** %s ***\n", men4[3][3]->name);
答案 1 :(得分:1)
首先,这两个案例
// dynamic multidimensional array of structures
man **men4;
men4 = malloc(10 * sizeof(man*));
for (i = 0; i < 10; i++)
men4[i] = malloc(10 * sizeof(man*));
和
// dynamic array of pointers to structure
man **men6;
men6 = malloc(10 * sizeof(*men6));
men6[3] = &john;
printf("*** %s ***\n", men6[3]->name);
在概念上是相同的。在这两种情况下,您都有一个指向man
指针的指针。您正在以不同方式使用这些指针。此外,第一个有错误。而不是:
men4[i] = malloc(10 * sizeof(man*));
你应该写的:
men4[i] = malloc(10 * sizeof(man));
因为每个men4[i]
都是“指向man
的指针”。这个错误就是为什么我通常更喜欢我的malloc()
调用形式:
a = malloc(N * sizeof *a);
所以,你的电话会变成:
men4[i] = malloc(10 * sizeof *men4[i]);
这不容易出错。
所以,你的问题(2)的答案是,你应该只在分配sizeof(man *)
时使用men4
,而不是在循环内部。 (或者,您现在知道更好的方式来调用malloc()
,因此调用超出循环变为men4 = malloc(10 * sizeof *men4);
。)
malloc()
电话外,一切正确。[]
,因为它是指向您想要的指针(多维),您需要两个**
。所以你得到:man **(men7[10]);
,但由于[]
的绑定比*
更紧密,你可以把它写成man **men7[10];
。men4
不是多维数组,也不是指针数组。它是指向man
的指针。为men4
分配内存时,为10 man
指针分配空间。然后,为每个指针分配10 man
的空间。您可以将men4
索引为多维数组的事实是这种分配的结果。在你的循环中,如果您愿意,可以为每个men4[i]
分配不同数量的man
值的空间,这对于多维数组是不可能的。指针不是数组。数组不是指针。有关详细信息,请阅读section 6 of the C FAQ中的所有问题和答案。
答案 2 :(得分:0)
sizeof(void*)
,等于sizeof(man*)
man ***men;
man **men[10];