c语言 - 数组元素"lost"函数外部



>我在文件中有一个矩阵,如下所示:

3
1 2 3
4 5 6
7 8 -9

其中第一行表示方阵顺序。我使用以下代码读取文件并将其存储到向量中(为了简单起见,我删除了所有if检查(:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int read_matrix_file(const char *fname, double *vector)
{
/* Try to open file */
FILE *fd = fopen(fname, "r");
char line[BUFSIZ];
fgets(line, sizeof line, fd);
int n;
sscanf(line, "%d", &n)
vector = realloc(vector, n * n * sizeof *vector);
memset(vector, 0, n * n * sizeof *vector);
/* Reads the elements */
int b;
for(int i=0; i < n; i++) {
// Read the i-th line into line
if (fgets(line, sizeof line, fd) == NULL) {
perror("fgets");
return(-1);
}
/* Reads th j-th element of i-th line into the vector */
char *elem_ptr = line;
for (int j=0; j < n; j++) {
if(sscanf(elem_ptr, "%lf%n", &vector[n*i+j] , &b) != 1) {
perror("sscanf");
return(1);
}
elem_ptr += b;
}
}
fclose(fd);
/* HERE PRINTS OK */
for(int i=0; i<n*n; i++)
printf("%i %fn",i, vector[i]);
return n;
}

read_matrix_file接收文件名和arraydoubles并填充数组,返回矩阵顺序。在此代码块中可以看到预期的用法。

int main(void)
{
const char *fname = "matrix.txt";
double *vector = malloc(sizeof * vector);
int n = read_matrix_file(fname, vector);
/* Here prints junk */
for(int i=0; i<n*n; i++)
printf("%i %fn",i, vector[i]);
free(vector);
}

问题是,printfread_matrix_file内工作正常,但在main中似乎无效。

我将数组分配给函数外部并通过"引用"传递它,但我对realloc非常怀疑,不幸的是我不知道如何修复或更好的方法。

您正在read_matrix_file()内重新分配内存,并将矩阵的元素存储在该内存区域中。但是当你离开函数时,由于指针vector是一个局部变量,所以当你离开函数时,它的新值会丢失。

当您回到内部时main()矢量仍然指向您之前分配的(现在可能无效的(内存区域malloc().

在调用read_matrix_file之前,应分配足够大的内存,如果要修改指针并查看反映在main()中的更改,则应传递双指针 (**(

我的意思是这样的:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int read_matrix_file(const char *fname, double **p_vector)
{
/* Try to open file */
FILE *fd = fopen(fname, "r");
char line[BUFSIZ];
fgets(line, sizeof line, fd);
int n;
sscanf(line, "%d", &n);
*p_vector = realloc(*p_vector, n * n * sizeof **p_vector);
double *vector = *p_vector;
memset(vector, 0, n * n * sizeof *vector);
/* Reads the elements */
int b;
for(int i=0; i < n; i++) {
// Read the i-th line into line
if (fgets(line, sizeof line, fd) == NULL) {
perror("fgets");
return(-1);
}
/* Reads th j-th element of i-th line into the vector */
char *elem_ptr = line;
for (int j=0; j < n; j++) {
if(sscanf(elem_ptr, "%lf%n", &vector[n*i+j] , &b) != 1) {
perror("sscanf");
return(1);
}
elem_ptr += b;
}
}
fclose(fd);
/* HERE PRINTS OK */
for(int i=0; i<n*n; i++)
printf("%i %fn",i, vector[i]);
return n;
}

在主要情况下,调用它:

int n = read_matrix_file(fname, &vector);

编辑:请注意,此代码无法正确处理realloc()故障。

相关内容

  • 没有找到相关文章

最新更新