读取字符串数组的行

时间:2013-10-14 16:47:28

标签: c file pointers segmentation-fault

我正在尝试使用来自文件的行填充字符串数组的函数,但编译器(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]’

3 个答案:

答案 0 :(得分:1)

首先,你做了一个典型的错误:char ** char (*)[128]相同。后者是adresses的类型。

当您尝试在行

中取消引用时,会出现分段错误
while(adresses[i-1][0] != EOF)

除了[i-1] i = 0的{​​{1}}给你的结果不好,你应该将你的函数定义为

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

能够正确传递您的二维数组,fscanf应该扫描到您的实际行缓冲区,如果您逐行阅读,请使用fgets

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

答案 1 :(得分:0)

当您将adresses[1024][128]传递给函数时,编译器只会执行一个衰减步骤,参数类型应为char (*)[128]而不是char **

您还需要将其第一个维度传递给该函数,这意味着

int getAdresses(char(int(* arr)[128],int x)

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

答案 2 :(得分:0)

您分配的数组声明

char adresses[1024][128]

实际上是char*(它不是,但它更接近它而不是char**)。

双重维度访问器实际上只是[x+y*width]的语法糖。

要将数组作为参数传递,请使用:

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