gpt4 book ai didi

c - C 中的二维动态数组分配和按引用传递

转载 作者:太空狗 更新时间:2023-10-29 14:53:32 27 4
gpt4 key购买 nike

比我聪明的人可以向我解释为什么以下代码段会出错吗?通过引用分配内存没有问题,但是一旦我尝试通过引用分配任何内容或释放内存,就会发生段错误。

我确信我遗漏了一些关于指针和引用传递的基本概念,希望可以阐明一些问题。

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

void allocateMatrix(float ***);
void fillMatrix(float ***);
void freeMatrix(float **);

int main() {
float **matrix;

allocateMatrix(&matrix); // this function calls and returns OK
fillMatrix(&matrix); // this function will segfault
freeMatrix(matrix); // this function will segfault

exit(0);
}

void allocateMatrix(float ***m) {
int i;
m = malloc(2*sizeof(float*));
for (i = 0; i < 2; i++) {
m[i] = malloc(2*sizeof(float));
}
return;
}

void fillMatrix(float ***m) {
int i,j;
for (i = 0; i < 2; i++) {
for (j = 0; j < 2; j++) {
(*m)[i][j] = 1.0; // SEGFAULT
}
}
return;
}

void freeMatrix(float **m) {
int i;
for (i = 0; i < 2; i++) {
free(m[i]); // SEGFAULT
}
free(m);
return;
}

最佳答案

这里有一组问题:

void allocateMatrix(float ***m) {
int i;
m = malloc(2*sizeof(float*));
for (i = 0; i < 2; i++) {
m[i] = malloc(2*sizeof(float));
}
return;
}

你需要分配给*m来获取返回给调用代码的信息,同时你还需要分配给(*m)[i]循环。

void allocateMatrix(float ***m)
{
*m = malloc(2*sizeof(float*));
for (int i = 0; i < 2; i++)
(*m)[i] = malloc(2*sizeof(float));
}

至少有可能其他功能没问题。 fillMatrix() 已正确编写和调用,但可以通过从指针中丢失第三个 * 来简化它:

void fillMatrix(float **m)
{
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 2; j++)
m[i][j] = 1.0;
}
}

将三重指针传递给 freeMatrix() 可能是明智的,这样您就可以在调用函数中将指针归零:

void freeMatrix(float ***m)
{
for (int i = 0; i < 2; i++)
free((*m)[i]);
free(*m);
*m = 0;
}

然后调用变成:

allocateMatrix(&matrix);
fillMatrix(matrix);
freeMatrix(&matrix);

关于c - C 中的二维动态数组分配和按引用传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10051642/

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