gpt4 book ai didi

C、传递二维数组

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

我已经有几年没有使用纯 C 语言了,但我似乎无法让这个真正基本的用例发挥作用。这是简单 C 中的简单用例,实际情况包装在 HDF 库中,但我需要先从这里开始。

#include <stdio.h>

void print_data(float **data, int I, int J)
{
for(int i=0;i<I;i++)
{
for(int j=0;j<J;j++)
printf("%02.2f\t", data[i][j]);
printf("\n");
}
}
void initialize_data(float **data, int I, int J)
{
for(int i=0;i<I;i++)
for(int j=0;j<J;j++)
data[i][j] = i * 6 + j + 1;
}
int main(int argc, char *argv[])
{
float data[4][6];
int I=4;
int J=6;
initialize_data((float **)data, 4,6);
print_data((float **)data, 4, 6);
return 0;
}

上述程序将导致失败并引发 EXC_BAD_ACCESS 信号。 GDB 输出:

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_PROTECTION_FAILURE at address: 0x00007fff5fc0131a
0x0000000100000de6 in initialize_data (data=0x7fff5fbff348, I=4, J=6) at simple.c:16
16 data[i][j] = i * 6 + j + 1;

我知道这真的很简单,但我已经无计可施了,想弄清楚这个简单的事情。有人可以为此指出正确的方向吗?

最佳答案

void print_data(float **data, int I, int J)

需要一个指针数组,指向(数组的第一个元素)float

但是当你通过了

float data[4][6];

您将指针传递给 float[6]

所以在 print_data 中,访问

data[i]

读取 sizeof(float*) 字节,在 data 地址之后偏移 i * sizeof(float*) 字节,并且将这些字节解释为 float*,然后在 data[i][j] 中取消引用(在添加合适的偏移量之后)。

因此,当您传递 2D 数组时,一些 float 值被解释为指针,然后跟随。这通常会导致段错误。

你可以声明

void print_data(float (*data)[6], int I, int J)

并传递你的二维数组,或者你需要传递一个指针数组,

float *rows[4];
for(i = 0; i < 4; ++i) {
rows[i] = &data[i][0];
}

并传递。或者,第三种可能性是传递并期待平面数组

void initialize_data(float* data, int I, int J) {
for(i = 0; i < I; ++i) {
for(j = 0; j < J; ++j) {
data[i*J + j] = whatever;
}
}
}

并从 main 传递 &data[0][0]

关于C、传递二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13750247/

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