2010-01-10 65 views
1

在(重新)學習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?它可以工作,但在我看來,更多的是指向結構的指針數組,而不是多維的結構數組!

在此先感謝。

回答

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)的答案是,您應該只在分配men4時使用sizeof(man *),但不能在循環中使用。 (或者,你現在知道一個更好的方式來調用malloc(),因此呼叫如雷貫耳循環將成爲men4 = malloc(10 * sizeof *men4);

  1. 這是正確的,除了malloc()呼叫如上所述。
  2. 見上。
  3. 你想要一個指向struct的指針數組。要得到一個數組,你需要[],因爲它是一個指向你想要的指針的指針(多維),所以你需要兩個**。所以你得到:man **(men7[10]);,但由於[]無論如何都要比*更緊密地綁定,所以你可以把它寫成man **men7[10];
  4. men4不是一個多維數組,也不是一個指針數組。它是指向man的指針。當您爲men4分配內存時,需要爲指向man的10個指針分配空間。然後,爲每個指針分配空間10 man。事實上,您可以將men4索引爲多維數組是這種分配的結果。在你的循環中,如果你願意的話,每個men4[i]可能已經被分配了不同數量的man值的空間,這對於多維數組是不可能的。

指針不是數組。數組不是指針。有關詳細信息,請閱讀section 6 of the C FAQ中的所有問題和答案。

0
  1. 語義正確
  2. IS指針數組,所以你必須分配指針大小的元件,並且指針的大小是sizeof(void*)等於sizeof(man*)
  3. man ***men;
  4. 是的。應該man **men[10];
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);