2016-04-17 145 views
0

我有一個主文件的問題。我有一個結構矩陣(理論上),我想修改所有結構中的所有「p」參數。 這是主要的文件:C取消指向不完整類型指針的錯誤

int main(int argc, char** argv) { 
int i, j; 

struct PQ *queue; 
queue = createQ(5); 
for (i = 0; i <= 5; i++) { 
    for (j = 0; j = 20; j++); 
    queue->mem[i][j].p = 1; 
} 

for (i = 0; i <= 5; i++) { 
    puts("\n"); 
    for (j = 0; j <= 20; j++); 
    printf("%d ",queue ->mem[i][j].p); 
} 


return (EXIT_SUCCESS); 
} 

這是包含結構definiton並生成功能的其它文件:

typedef struct newLine{ 
    unsigned p; 
} newLine; 


struct PQ{ 
    struct newLine ** mem; 
}; 

struct PQ *createQ(unsigned min){ 
    int i=0; 
    struct PQ *newQ = malloc(sizeof(PQ)); 
    newQ->mem = malloc(min*sizeof(newLine *)); 

    for(i=0;i<=min;i++){ 
     newQ->mem[i]=calloc(20,sizeof(newLine)); 
    } 

    return newQ; 
} 

任何想法?

+0

能否請您提供一個[MCVE](https://stackoverflow.com/help/mcve)以及您的編譯器/鏈接器輸出顯示th e您在問題標題中發佈的錯誤消息?它將顯着幫助我們。謝謝。 – DevNull

+0

main.c:函數'main'中: main.c:13:14:錯誤:解除指向不完整類型的指針 queue-> mem [i] [j] - > p = 1; ^ main.c:19:28:錯誤:解除指向不完整類型的指針 printf(「%d」,queue - > mem [i] [j] - > p); –

+2

'queue-> mem [i] [j] - > p' - >'queue-> mem [i] [j] .p'也是for(int i = 0; i = min; i ++){' :'我= min'是錯誤的。 – BLUEPIXY

回答

3

由於struct是C類型的一部分,所以您必須在struct PQ中使用struct newline,您將看到該錯誤。 另一種方法是使用typedef創建類型別名:

typedef struct newline { 
    int p; 
} newline; 

的方式來訪問結構的成員是使用。在struct上,使用 - >指向struct的指針,所以使用queue->mem[i][j].p代替。

還有其他問題。

無法取消引用未初始化的指針,它產生未定義行爲:

PQ *newQ; 

應該是:

struct PQ *newQ = malloc(sizeof(struct PQ)); 

你應該用正確的間接性分配:

newQ->mem = malloc(min * sizeof(newline*)); 
for(int I = 0;i < min; i++){ 
    newQ->mem[i] = calloc(20, sizeof(newLine)); 
} 
+0

我編輯了初始post.Same行爲。「queue-> mem [i] [j] .p = 1;」和「printf(」%d「,隊列 - > mem [i] [j] .p);」從主文件給我解引用指向不完整類型錯誤的指針。 –

+0

你是否在main.c中包含其他文件? – fluter

+0

是的,我希望我做得很好。 –

相關問題