0

我正在尝试使用文件中的行填充字符串数组的函数,但编译器(GCC)仍然给我一个警告。如果我尝试运行已编译的应用程序,它会给我“分段错误”错误
源代码:

主要的

#include <stdio.h>

#include "getAdresses.h"

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

}

获取地址

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]’
4

3 回答 3

1

首先,您犯了一个典型的错误char **与. 后者是 的类型。char (*)[128]adresses

当您尝试在行中取消引用它时,您会遇到分段错误

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

除了解决这个[i-1]问题i = 0会给你带来不好的结果之外,你应该将你的函数定义为

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

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

while(fgets(adresses[i], 128, fr)) i++;
于 2013-10-14T16:52:27.523 回答
0

当你传递adresses[1024][128]给一个函数时,编译器只会做一步衰减,参数类型应该是char (*)[128]而不是char **.

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

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

查看 c-faq 以获取有关此问题的详细说明。

于 2013-10-14T16:52:06.693 回答
0

您分配的数组声明

char adresses[1024][128]

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

双维访问器实际上只是[x+y*width].

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

int getAdresses(char (*adresses)[128])
于 2013-10-14T16:53:00.617 回答