2013-07-18 58 views
5

我有一個奇怪的問題做一個練習:如何測試這個C函數

寫其採取的指針的指針的指針的指針的指針的指針的函數一個int指針指針的指針作爲參數併爲其賦值。

我認爲我寫的函數是正確的(如果不是,請更正),但是如何測試它?

void function(int *********anInt) 
{ 
    *********anInt = 5; 
} 

我想:

int main(void) { 
    int *********nbr = malloc(sizeof(int)); 
    function(nbr); 
    printf("%d", *********nbr); 
} 

但我得到一個段錯誤,我剛剛得知mallocpointers所以我不完全理解。

+11

這是什麼樣的任務是這樣的? –

+1

似乎很愚蠢的權利 - 但 - 但我仍然必須這樣做,所以任何幫助,將不勝感激; P – ItsASecret

+0

看起來你的任務是爲了強調如何指針工作,雖然他們重新...重視太多了!你錯過了&符號(地址)去除! –

回答

18

當然,你可以測試它,雖然它看起來很奇怪。

#include <stdio.h> 

void function(int *********anInt) 
{ 
    *********anInt = 5; 
} 

int main() 
{ 
    int n = 0; 
    int *p1 = &n; 
    int **p2 = &p1; 
    int ***p3 = &p2; 
    int ****p4 = &p3; 
    int *****p5 = &p4; 
    int ******p6 = &p5; 
    int *******p7 = &p6; 
    int ********p8 = &p7; 
    function(&p8); 
    printf("%d\n", n); 
    return 0; 
} 
+0

非常感謝你,我會盡快接受! ; P – ItsASecret

2

int**是指向指針的指針:

int myInt; 
int* pInt = &myInt; 
int** ppInt = &pInt; 

int***是指向一個指向指針的指針的指針:

int*** pppInt = &ppInt; 

爲了測試你的功能,你需要隨時隨地進行,這是正確的次數。

+0

我得到了它的感謝; P – ItsASecret

7

嘗試

int main() { 
    int *********nbr; 

      nbr = malloc(sizeof(int********)); 
      *nbr = malloc(sizeof(int*******)); 
      **nbr = malloc(sizeof(int******)); 
     ***nbr = malloc(sizeof(int*****)); 
     ****nbr = malloc(sizeof(int****)); 
     *****nbr = malloc(sizeof(int***)); 
     ******nbr = malloc(sizeof(int**)); 
    *******nbr = malloc(sizeof(int*)); 
    ********nbr = malloc(sizeof(int)); 
    function(nbr); 
    printf("%d", *********nbr); 
} 
+1

我愛瘋狂。 –

+1

第一個不起作用。第二個很漂亮。 :D – md5

+0

@ md5你好,我認爲它會很緊湊。刪除它,直到我想出一個更好的辦法:) –

5

你需要一個可笑的主程序去與來自地獄的任務!

int main(void) 
{ 
    int   l0 = 0; 
    int  *l1 = &l0; 
    int  **l2 = &l1; 
    int  ***l3 = &l2; 
    int  ****l4 = &l3; 
    int *****l5 = &l4; 
    int ******l6 = &l5; 
    int *******l7 = &l6; 
    int ********l8 = &l7; 

    printf("%d %d %d %d %d %d %d %d %d\n", l0, *l1, **l2, ***l3, ****l4, *****l5, 
      ******l6, *******l7, ********l8); 
    function(&l8); 
    printf("%d %d %d %d %d %d %d %d %d\n", l0, *l1, **l2, ***l3, ****l4, *****l5, 
      ******l6, *******l7, ********l8); 
    return 0; 
} 

未經測試:也許我沒有計算正確的東西,但總體思路是正確的。這是一個酷刑測試 - 對於無辜的C程序員和編譯器。

+0

哈哈很可笑的問題值得一個荒謬的答案,我猜; P – ItsASecret

+3

我想其中一些在這些聲明中'*'應該是'&'s。 – Pixelchemist

+0

'* l0' - 解引用0不是一個好主意 – SomeWittyUsername

1

見MD5的解決方案,但是它缺乏交代

解釋:

你的測試程序沒有工作的原因是因爲的malloc返回void*這簡直是一個內存地址(指針)。你將它分配給int*****...,這意味着當程序試圖解除引用到實際的int時,它首先獲取int的內存地址並取消引用它(這沒關係),但之後因爲你的值(5)是現在它的價值,然後derefences,這應該回來與你的段錯誤。分配的

想作爲嵌套解除引用:

int ********p8 = *anInt; // p8 == 5 
int *******p7 = *p8; // This breaks since dereferencing memory 
        // address 5 results in a segfault 

做了什麼的分配提領時,我們有內存地址(指針)取消引用,最終得到避免這是我們實際上嵌套指針這樣存儲該值的內存地址。