gpt4 book ai didi

c - 为什么用函数修改二维数组不起作用?

转载 作者:太空宇宙 更新时间:2023-11-04 08:14:50 25 4
gpt4 key购买 nike

这是我处理二维数组的代码。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>

void print_array(double ** m, int n)
{
int i, j;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++)
printf("%.2f ", m[i][j]);

printf("\n");
}
return;
}

double ** allocate_array(int n)
{
double ** m = (double **)calloc(sizeof(double *), n);
int i;
for (i = 0; i < n; i++)
m[i] = (double *)calloc(sizeof(double), n);

return m;
}

void free_array(double ** m, int n)
{
int i;
for (i = 0; i < n; i++)
free(m[i]);
free(m);

return;
}

// array_sum(result, sum1, sum2, dimensions)
void array_sum(double ** sum, double ** x1, double ** x2, int n)
{
double **s;
s = allocate_array(n);

int i, j;
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
s[i][j] = x1[i][j] + x2[i][j];

memcpy(sum, s, sizeof(**s)*n);
free_array(s, n);

printf("hhh\n");
print_array(sum, n);
return;

int main()
{
int n;
FILE* f;
f = fopen("array.txt", "r");
fscanf(f, "%d", &n);

double **m;
m = allocate_array(n);

int i; int j;
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
fscanf(f, "%lf", &m[i][j]);

//print_array(m, n);
double **k;
k = allocate_array(n);
array_sum(k, m, m, n);
//print_array(k, n);




free_array(m, n);
return 0;
}

为什么释放 s 结果同时也释放了 sum 而结果函数没有返回正确的结果?我应该使用什么来通过指针修改函数中的对象,如数组 os 结构?

最佳答案

对于初学者这个声明

memcpy(sum, s, sizeof(**s)*n);
^^^^^^^^^^^

无效。

应该是这样的

memcpy(sum, s, sizeof( *s ) * n);
^^^^^^^^^^^^

此语句将指针从 s 指向的数组复制到 sum 指向的数组。

但是在这个语句之后

free_array(s, n);

这些指针变得无效,因为这些指针指向的内存被释放了。

考虑到您分配了占用不同内存范围的 n + 1 个数组,您不能使用 memcpy 复制所有这些数组。

随便写

void array_sum(double ** sum, double ** x1, double ** x2, int n)
{
int i, j;
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
sum[i][j] = x1[i][j] + x2[i][j];

printf("hhh\n");
print_array(sum, n);
}

你还应该添加声明

free_array(k, n);

主要是为了释放 k.. 指向的已分配数组

关于c - 为什么用函数修改二维数组不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36410770/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com