2015-10-12 67 views
0

所以我創建了兩個文件:編譯多個文件的錯誤

file1.c中

#include "file2.h" 
... 
int *p; <-GLOBAL VARIABLE 
... 
void main(){ 
    printer(); 
} 

file2.c中

#include "file1.h" 

void printer(){ 
    *p = 5; 
     printf("%d",*p); 
} 

file1.h

extern int *p; 

file2.h

extern void printer(void); 

代碼編譯。但是,當我運行它時,出現分段錯誤。我試圖在任何地方尋找解決方案,但找不到一個好的解決方案。

我試着用file122.h替換printer(void),用printer()沒有結果(也不確定它是否正確)。

有沒有人可能會看到我的問題的解決方案?

+0

只是作爲一個位的信息:不要在頭文件中聲明變量的實例。相反,在.c文件之一中的任何函數之外聲明全局變量,然後在頭文件中聲明相同的變量,前綴爲'extern'。任何使用該全局變量的文件都可以通過#include頭文件訪問它,然後使用該變量,就好像它是當前的.c文件的本地一樣。 – user3629249

+0

指針'p'未指向任何特定的用戶內存。在進程初始化爲0x00的全局內存中,訪問地址0(不是用戶可訪問的內存的一部分)是導致seg故障事件的原因。 – user3629249

+0

* p表示p指向的值是否等於5? –

回答

1

你從來沒有分配內存給p來引用或以其他方式初始化爲正確分配內存的引用。當你做*p = 5時,你試圖引用你不允許訪問的內存。

一個典型的解決方案是動態分配內存,例如:在一個文件中的條款

p = malloc(sizeof(int)); 
+0

試過了,但仍然沒有打印數字 –

+0

哦,其實,我的控制檯滾動了。有效。謝謝 –

1

想到這一點:

#include <stdio.h> 
int *p; <-GLOBAL VARIABLE 

void printer(); 

void main(){ 
    printer(); 
} 

void printer(){ 
    *p = 5; 
    printf("%d",*p); 
} 

你做了什麼是邁出了初始化,但未定義指向一個整數的指針的變量。當你去設置該指針時,它不會被初始化。您需要初始化它並使用&或更好地引用它,動態地爲它分配內存。

也許在你的主要功能,你可以這樣做:

int main(){ 
    p = calloc(1, sizeof(int)); 
    printer(); 
    free(p); 
} 
+0

好的,我添加了這一行,但它仍然不打印數字 –

+0

哦,實際上,我的控制檯向上捲動。有效。謝謝 –