2014-10-02 105 views
1

我有一個簡單的結構。指向指向c中結構的指針

struct grades 
{ 
int lowest; 
int highest; 
}; 

然後,我要創建一個函數,該函數返回一個初始化結構的指針。

struct *grades setGrades(int low, int high) 
{ 
    struct *ptr = malloc(sizeof(struct grades)); 
    ptr->lowest = low; 
    ptr->highest = high; 
    return ptr; 
} 

現在我應該使一個函數定義與struct **grades random(int size); 我應該爲指針數組以grade結構具有等於size元件的數量分配空間。當創建指針數組時,我想將數組中的每個指針設置爲一個新創建的數據結構,該結構的低變量等於10,高變量等於100,然後返回指針。

在這一點上,我真的迷失了,因爲我在網上查找結構的雙指針,但沒有找到任何可以幫助我清楚理解的例子。我在想,如果有人能夠向我解釋結構的雙重指針是如何工作的,它會給我一個正確方向上的好開始。

+7

'struct * grades'和'struct * ptr' ??? – isedev 2014-10-02 14:42:47

+1

更好的函數名稱將是'createGradeSet',因爲每次調用時都會返回一個新結構。 – 2014-10-02 14:45:02

+0

編輯。該函數只是返回一個將初始化等級結構的指針。我故意做了一個簡單的問題,更多的指針密集,所以我可以學習。我知道你可能會認爲他爲什麼這樣做?@isedev是否應該被命名爲別的東西? – user1010101 2014-10-02 14:45:12

回答

2

你稱之爲「雙指針」只是一個指向指針的指針。就是說,struct grade example是一個包含lowesthighest的變量,如您所定義的那樣。一個指針,struct grade *example是一個變量,用於存儲相同結構的內存地址。指向指針的指針struct grade **example是一個變量,用於存儲存儲結構內存地址的變量的內存地址。更詳細的解釋可以參見here。不管怎麼說,回答您的具體問題,一個函數是:

struct grades** random(int size) { 
    struct grades** result = malloc(sizeof(struct grades*) * size); //here you are 
                //allocating enough space for an 
                //array of pointers 
    int i; 
    for(i = 0; i < size; i++) { 
     result[i] = setGrades(10, 100); //here you are setting each pointer to one 
             //grade through the function you've already 
             //defined 
    } 

    return result; 
} 
+0

如何打印由doule指針設置的值以檢查它是否已設置? – user1010101 2014-10-02 15:36:56

+1

對於單個指針,您會打印'result-> lowest',是否正確?對於指向指針的指針,你需要使用'result [i] - > lowest''。在這裏,'result [i]'是指向等級的指針數組中的第i個指針。 – wolfPack88 2014-10-02 15:43:36

2
struct grades { int lowest; int highest; }; 

struct grades * createGradeSet(int low, int high) //careful: return type is struct grades * 
{ 
    // variable name: ptr, type: struct grades * 
    struct grades * ptr = malloc(sizeof(struct grades)); 
    ptr->lowest = low; 
    ptr->highest = high; 
    return ptr; 
} 

struct grades ** random(int size) 
{ 
    // Create a pointer to an array of struct grades pointers 
    // the size of the array is `size` x the size of a struct grades pointer 
    struct grades ** ptr_arr = malloc(sizeof(struct grades *) * size); 
    for (unsigned int i = 0; i < size; i++) 
    ptr_arr[i] = createGradeSet(10, 100); // assign a newly created Gradeset to every cell 
    return ptr_arr; 
} 
1

請嘗試以下

struct grades ** random(size_t size) 
{ 
    if (size == 0) return NULL: 

    struct grades **p = malloc(size * sizeof(struct grades *)); 

    if (p != NULL) 
    { 
     size_t i = 0; 
     do 
     { 
      p[i] = malloc(sizeof(struct grades)); 
      if (p[i] != NULL) 
      { 
       p[i]->lowest = 10; 
       p[i]->highest = 100; 
      } 
     } while (p[i] != NULL && ++i < size); 

     if (i != size) 
     { 
      for (size_t j = 0; j < i; j++) free(p[i]); 
     } 
     free(p); 
     p = NULL;  
    } 

    return p; 
}  

功能setGrades應該寫成

struct *grades setGrades(int low, int high) 
{ 
    struct *p = malloc(sizeof(struct grades)); 

    if (p != NULL) 
    { 
     p->lowest = low; 
     p->highest = high; 
    } 

    return p; 
} 

在這種情況下,while循環了嗎在上面的函數中可以寫成

 do 
     { 
      p[i] = setGrades(10, 100); 
     } while (p[i] != NULL && ++i < size); 
+1

請注意,檢查'malloc()'的返回值不能保存你的程序不再崩潰:現代內核提交它們的內存,所以'malloc()'在正常情況下不會返回NULL。該程序既不會崩潰也不會有機會認識到沒有內存來支持它的分配,當內核意識到內存不足時它會被拍攝。因此,檢查'malloc()'的返回值遠遠不如以前那樣明智。特別是考慮它如何混淆你的代碼。 – cmaster 2014-10-02 15:14:30

+0

@cmaster這只是一個愚蠢的事情。 – 2014-10-02 15:20:50

+0

不,我不這麼認爲:內核基本上不可能知道它何時過度使用內存,如果使用保守策略,實際使用所有可用內存幾乎是不可能的。考慮分叉的影響:理論上,新流程需要與舊分區一樣多的內存。因此,在保守的政策下,如果您的流程已經佔據了一半的內存,您將無法分流。但是在由於system()調用而產生的fork中,fork會立即釋放繼承的內存。所以內核不應該阻止你的進程分叉。 – cmaster 2014-10-02 15:48:22