Write/read 内部双指针 C

Write/read inside double pointer C

我目前无法写入和读取双指针。这是我第一次使用它们,我有点困惑,尤其是因为它是一个二维数组。

为了简化我的代码,我在 main (Float32 = typedef float) 中有:

Float32 **myTable;
myTable = malloc(sizeof(Float32) * NB_MAX_X * NB_MAX_Y);
myFunction(myTable);

NB_MAX_X 和 NB_MAX_Y 是非常大的数字,我不得不在堆内存中初始化变量。

在我的函数中(我使用的是 HDF5 库):

void myFunction (Float32 **myTable)
{
    file_id = H5Fopen(FILE, H5F_ACC_RDWR, H5P_DEFAULT);
    dataset_id = H5Dopen2(file_id, "/SIGDAT/SIGDAT_VALUE", H5P_DEFAULT);

    // My problem start here
    status = H5Dread(dataset_id, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, myTable);

    /* Show the dataset. */
    for (i = 0; i < NB_MAX_X; i++)
    {
        for (j = 0; j < NB_MAX_Y; j++)
        {
            printf("%f ", myTable[i][j]);
        }
        printf("\n");
    }printf("\n");

为了以防万一,给大家分享一下《H5Dread》的原型:

H5_DLL herr_t H5Dread (
        hid_t dset_id,
        hid_t mem_type_id,
        hid_t mem_space_id,
        hid_t file_space_id,
        hid_t dxpl_id,
        void *buf /*out*/);

我不知道我能不能写,但当我读到它时,我收到了这条消息: 读取位置 0x0000000100000001

时发生访问冲突

感谢您的帮助

我认为没有理由使 myTable 成为双指针。我建议将它设为指向二维数组中第一行的指针。这也匹配 H5Dread 签名,在这种情况下,它采用 void* 到平面(浮点)数组,因为您已经指定使用 H5P_DEFAULT 传输 属性。您还使用 H5T_NATIVE_INT 我怀疑它应该是 H5T_NATIVE_REAL 或类似的浮点数 mem_type_id.

herr_t H5Dread( hid_t dataset_id, hid_t mem_type_id, hid_t mem_space_id,
                hid_t file_space_id, hid_t xfer_plist_id, void * buf );

示例:

#include <stdlib.h>

void myFunction(Float32 (*myTable)[NB_MAX_X]) {
    // ...
    status = H5Dread(dataset_id, H5T_NATIVE_ /* type */, H5S_ALL, H5S_ALL,
                     H5P_DEFAULT, myTable);
    // ...
}

int main() {   
    Float32 (*myTable)[NB_MAX_X] = malloc(NB_MAX_Y * sizeof *myTable);
    myFunction(myTable);    
}

来自评论:

I'm having a little trouble figuring out how my array is declared and whether it's a 1D or 2D array. At first sight, my array stops at NB_MAX_X values. Whereas I want NB_MAX_X * NB_MAX_Y.

我使用的分配方式使用定义的类型来确定取消引用所需的内存大小并使用sizeof。那就是 sizeof *myTable - 与下面的 sizeof(Float32[NB_MAX_X]) 相同:

sizeof *myTable

现在,这为您提供了 Float32[NB_MAX_X] 一个 元素的大小,您需要 space 用于 NB_MAX_Y 这样的元素:

NB_MAX_Y * sizeof *myTable

If I printf("%f",myTable[NB_MAX_Y-1][NB_MAX_X-1]); I am not in the memory area of my variable :/

是的,如果您确实按照我建议的方式分配内存,那么您肯定是。如果它打印出一个“垃圾”值,我们就错过了问题中的一条信息。您的文件可能在 Float32 秒内出现问题。这不是上面的声明 - 但如果有疑问,写入 Float32 的代码会清除它。