代码之家  ›  专栏  ›  技术社区  ›  Schneems

将指针指定给C99中结构中的二维空数组

  •  0
  • Schneems  · 技术社区  · 7 年前

    我有一个2d缓冲区,我想把它和其他值一起传递给一个线程,所以我需要把它移到一个结构中。当我尝试这样做时,我无法在我的结构中再次访问中的值,我需要一些帮助。

    这是我的缓冲区:

    void* mybuff[8][16384];
    

    typedef struct  {
      int i;
      void *mybuff;
    } arg_struct_t;
    

        arg_struct_t *args = malloc(sizeof(arg_struct_t));
        args->i = index;
        args->mybuff = mybuff;
    
        fprintf(stderr, "%p\n", args->mybuff[0][0]);
    

    我得到一个错误:

    main.c:104:47: warning: dereferencing ‘void *’ pointer [enabled by default]
               fprintf(stderr, "%p\n", args->mybuff[0][0]);
                                                   ^
    main.c:104:50: error: subscripted value is neither array nor pointer nor vector
               fprintf(stderr, "%p\n", args->mybuff[0][0]);
                                                      ^
    

    我想我需要告诉C99更多关于我想放入我的结构中的数据的形状的信息,但是我不太明白该怎么做。我很感激你的帮助和见解。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Konstantin Murugov    7 年前

    编译器不知道,它必须在这里计算内存中的哪个地址:

    args->mybuff[0][0]
    

    因为 args->mybuff 只是指向void的指针。要处理这样的表达式,编译器需要1)数组元素的大小和2)数组的至少一个维度的信息。 以下代码更为正确:

    typedef void* TBuff[8][16834];
    TBuff mybuff;
    
    typedef struct  {
      int i;
      TBuff * mybuff;
    } arg_struct_t;
    
    arg_struct_t *args = malloc(sizeof(arg_struct_t));
    args->i = index;
    args->mybuff = &mybuff;
    fprintf(stderr, "%p\n", (*args->mybuff)[0][0]);
    
        2
  •  1
  •   Joshua    7 年前

    冒着让你越想越远的风险:

    typedef struct  {
      int i;
      void* mybuff[8][16384];
    } arg_struct_t;
    

        3
  •  1
  •   Phillip Ngan    7 年前

    下面是如何存储mybuff的地址,以及以后如何使用该指针访问值。

    int main()
    {
        // Starting array    
        int* mybuff[8][16384];
    
        // Save the address of mybuff into 'p'. 'p' is a pointer to (int*)'s
        int** p = &mybuff[0][0];
    
        // Access the location of row=3, col=4 using 'p'
        int r = 3;
        int c = 4;
        *(p + (r*16384 + c)) = (int*) 123; // 123 is the value to assign
    
        return 0;
    }
    

    因此,还需要在结构中传递行和列大小(8和16384),以便取消对值的引用。为了简洁起见,我在示例中省略了边界检查,但您应该在实际代码中这样做。