2013-10-14 72 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])