C:结构和数组 - 需要概述和帮助

时间:2010-01-10 10:51:14

标签: c

在我(重新)学习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;
}

你可以:

  1. 告诉我一切是否正确
  2. 解释为什么在men4中我使用sizeof(man*)但在men6中它是sizeof(*men6)(星号位置)
  3. 解释如何创建指向结构的动态多维数组(最后一点)
  4. 解释我men4?它可以工作,但在我看来,更多的是结构指针数组而不是多维结构数组!
  5. 提前致谢。

3 个答案:

答案 0 :(得分:1)

  • 2:这是两个做同样事情的例子:sizeof(*men6) == sizeof(man*)
  • 3:与men5示例相同,但是多维。
  • 4:men4示例不太正确。据我所知,这个例子必须是:

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

  1. 除了上面提到的malloc()电话外,一切正确。
  2. 见上文。
  3. 你想要一个指向struct的指针数组。要获取数组,您需要[],因为它是指向您想要的指针(多维),您需要两个**。所以你得到:man **(men7[10]);,但由于[]的绑定比*更紧密,你可以把它写成man **men7[10];
  4. men4不是多维数组,也不是指针数组。它是指向man的指针。为men4分配内存时,为10 man指针分配空间。然后,为每个指针分配10 man的空间。您可以将men4索引为多维数组的事实是这种分配的结果。在你的循环中,如果您愿意,可以为每个men4[i]分配不同数量的man值的空间,这对于多维数组是不可能的。
  5. 指针不是数组。数组不是指针。有关详细信息,请阅读section 6 of the C FAQ中的所有问题和答案。

答案 2 :(得分:0)

  1. 语义正确
  2. IS 指针数组,因此您必须分配指针大小的元素,指针的大小为sizeof(void*),等于sizeof(man*)
  3. man ***men;
  4. 是的,确实如此。应该是man **men[10];