C 打印指向无括号矩阵的指针
我正在从一个文本文件中获取一个输入,该文件如下所示:C 打印指向无括号矩阵的指针,c,pointers,matrix,C,Pointers,Matrix,我正在从一个文本文件中获取一个输入,该文件如下所示: 3 2 4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 第一行是存储在m中的矩阵A中的行数,第二行是存储在n中的矩阵A中的列数和矩阵B中的行数,第三行是存储在p中的矩阵B中的列数 我使用此功能从文本文件中获取信息: void read_matrices(int **A, int **B, int **C, int *m, int *n, int *p, char *file) { FILE *f
3
2
4
1 2
3 4
5 6
7 8 9 10
11 12 13 14
第一行是存储在m中的矩阵A中的行数,第二行是存储在n中的矩阵A中的列数和矩阵B中的行数,第三行是存储在p中的矩阵B中的列数
我使用此功能从文本文件中获取信息:
void read_matrices(int **A, int **B, int **C, int *m, int *n, int *p, char *file) {
FILE *fp = fopen(file, "r");
if (!fp) {
fprintf(stderr, "\n Error: file open failed for file '%s'\n\n", file);
exit(0);
}
/* read & output m, n, p */
fscanf(fp, "%d\n%d\n%d\n", m, n, p);
/* allocate memory for A and set values to null */
*A = (int*)calloc(*m * *n, sizeof(int));
/* read A */
int i, j;
for (i = 0; i < *m; i++) {
fscanf(fp, "\n");
for (j = 0; j < *n; j++) {
fscanf(fp, "%d", (A + i * *n + j));
}
}
/* allocate memory for B and set values null */
*B = (int*)calloc(*n * *p, sizeof(int));
/* read B */
for (i = 0; i < *n; i++) {
fscanf(fp, "\n");
for (j = 0; j < *p; j++) {
fscanf(fp, "%d", (B + i * *p + j));
}
}
/* allocate memory for C and set values null */
*C = (int*)calloc(*m * *p, sizeof(int));
/* close FP & free allocated memory */
fclose(fp);
}
void print_matrix(int *mtx, int r, int c) {
int i, j;
for (i = 0; i < r; i++) {
printf("\n");
for (j = 0; j < c; j++) {
printf("%5d", (mtx + i * c + j));
}
}
}
同样,当我更改fscanf(fp,“%d”,(A+I**n+j));到fscanf(fp,“%d”,*(A+i**n+j));我得到了一个总线错误,但是现在我得到了警告:int格式,指针arg。在元素读取中写入的两个目标都使用了错误的指针值
fscanf(fp, "%d", (A + i * *n + j));
应该是
fscanf(fp, "%d", (*A + i * *n + j));
// here ----------^
fscanf(fp, "%d", (*B + i * *p + j));
// here ----------^
第二个矩阵也存在类似问题:
fscanf(fp, "%d", (B + i * *p + j));
应该是
fscanf(fp, "%d", (*A + i * *n + j));
// here ----------^
fscanf(fp, "%d", (*B + i * *p + j));
// here ----------^
大多数现代编译器都会警告你这一点,如果你不这样做的话,你要么会弹出编译器警告,要么会得到一个有头脑的工具链。例如,叮当声会发出:
main.c:24:30: Format specifies type 'int *' but the argument has type 'int **'
它也是printf(“%5d”,*(mtx+i*c+j));还有吗?@user3339703是的,这是一个单独的问题,但同样需要解决。我对你用错误的指针计算写作更感兴趣。