2013-10-14 78 views
0

我正在嘗試使用從文件中的行填充字符串數組的函數,但編譯器(GCC)仍然給我一個警告。比我嘗試運行編譯應用程序,它給了我 「分段錯誤」 錯誤
源代碼:
將行讀入到字符串數組

主要

#include <stdio.h> 

#include "getAdresses.h" 

int main(int argc, char **argv){ 
     char adresses[1024][128]; 
     getAdresses(adresses); 
     printf("%s", adresses[1]); 

} 

getAdresses

include <stdio.h> 

int getAdresses(char **adresses){ 
     FILE *fr; 
     fr = fopen("adresses", "r"); 
     int i = 0; 
     while(adresses[i-1][0] != EOF){ 
       fscanf(fr, "%s\n", &adresses[i]); 
       i++; 
     } 
} 

它給我這個錯誤:

main.c: In function ‘main’: 
main.c:9:2: warning: passing argument 1 of ‘getAdresses’ from incompatible pointer type [enabled by default] 
In file included from main.c:3:0: 
getAdresses.h:1:5: note: expected ‘char **’ but argument is of type ‘char (*)[128]’ 
+0

所以兩diemensional陣列罷工再次... – Dariusz

+0

AFAIKT它的「只是」一個警告,所以代碼至少應該工作。我認爲從文件中讀取未綁定不是一個好主意。如果您嘗試閱讀更多的1024個「字符串」,您認爲會發生什麼? – Friedrich

+0

編譯器告訴你你做錯了什麼。它是一個警告,因爲它可能是你的意思是通過錯誤的類型,但如果你不明白的警告,那麼你應該把它視爲致命的。 – pm100

回答

0

當您將adresses[1024][128]傳遞給函數時,編譯器將只執行一個衰減步驟,參數類型應爲char (*)[128]而不是char **

還需要其第一尺寸傳遞給函數,這意味着

INT getAdresses(燒焦(INT(* ARR)[128],INT X)

check the c-faq for a detailed explanation for this issue.

1

首先所有你已經完成了典型的錯誤:char **同爲char (*)[128]後者是adresses類型

呦。 u得到分段錯誤時,你在排隊的事實,對於i = 0 adressing [i-1]會給你不好的結果,你應該定義功能

int getAdresses(char (*adresses)[128]) 

能夠嘗試取消對它的引用

while(adresses[i-1][0] != EOF) 

除了以正確傳遞您的二維陣列並fscanf應掃描到您的實際行緩衝區,如果您正在逐行讀取使用fgets

while(fgets(adresses[i], 128, fr)) i++; 
0

你分配的聲明

char adresses[1024][128] 

的數組實際上是一個char*(它不是,但它不是char**更接近它)。

double diamension訪問器實際上只是[x+y*width]的語法糖。

到數組作爲參數傳遞使用:

int getAdresses(char (*adresses)[128])