我正在尝试使用来自文件的行填充字符串数组的函数,但编译器(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]’
答案 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)
答案 2 :(得分:0)
您分配的数组声明
char adresses[1024][128]
实际上是char*
(它不是,但它更接近它而不是char**
)。
双重维度访问器实际上只是[x+y*width]
的语法糖。
要将数组作为参数传递,请使用:
int getAdresses(char (*adresses)[128])