使用函数分配复杂的自定义数据结构

问题描述 投票:0回答:1

我正在尝试为某些数据结构(数组,矩阵,custom_array,...)分配内存。我认为我面临的问题是我无法将正确的类型转换为我初始化为

NULL
的传递指针。请记住,我正在传递指针的地址
(
init_structs(&ptr1, &ptr2, &ptr3, ...)
):

int init_structures(void* d_decharge,
                    void* d_poubelles,
                    void* e_camions,
                    int m, int n,
                    int *tamp_id, int* file_msg_id)
{
    *d_decharge = (int*)malloc(m * sizeof(int));
    if (*d_decharge == NULL){
        printf("echec malloc dist_decharge\n");
        return 1;
    }

    *d_poubelles = (int**)new_matrix(m);
    if(*d_poubelles == NULL){
        printf("echec malloc dist_decharge\n");
        return 1;
    }

    key_t key_tamp = ftok("./src/main.c", 64);
    int id = shmget(key_tamp, sizeof(camion_t) * n, 0666 | IPC_CREAT);
    if (id == -1){
        printf("echec creation du tampon etats_camions, error[%s]\n", strerror(errno));
        return 1;
    }
    *tamp_id = id;
    *e_camions = (camion_t*)shmat(*tamp_id, NULL, 0);
    
    key_t key_msg = ftok("./src/main.c", 64);
    id = msgget(key_msg, 0666 | IPC_CREAT);
    if(id==-1){
        printf("echec creation de la file de messages Faffec, error[%s]\n", strerror(errno));
        return 1;
    }
    *file_msg_id = id;
    return 0;
}

我尝试声明正确的类型,但这只是遇到了传递复制问题。

c malloc function-pointers void-pointers
1个回答
0
投票

我认为我面临的问题是我无法将正确的类型转换为传递的指针[...]。我正在传递指针的地址 (

init_structs(&ptr1, &ptr2, &ptr3, ...)
).

可以执行足够的转换以使您的函数正常工作,但为什么呢? 大多数除算术目的以外的铸造都是设计不良的症状。 在这种情况下,您将(显然)传递一个

int **
、一个
int ***
(恶心)和一个
camion_t **
init_structures()
并依赖于这些类型,但该函数将它们作为类型
 接收void *
。 要使用它,您需要将指针转换回函数内的原始类型,但是比将它们作为原始类型传递要干净得多:

int init_structures(int **d_decharge,
                    int ***d_poubelles,
                    camion_t **e_camions,
                    int m, int n,
                    int *tamp_id, int* file_msg_id) // ...

当然,这是假设这些实际上是正确的类型,因为它们确实应该如此。 但如果原来的

ptr1
ptr2
ptr3
全部是
void *
那么

  1. 什么?
  2. 您可能希望使用类型
    void **
    作为函数参数,而不是
    void *
    或上述指针类型。
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.