在C99中为结构中的2D空数组分配一个指针

时间:2019-03-14 03:55:16

标签: c arrays pointers struct

我有一个2d缓冲区,我想将其与其他值一起传递给线程,因此我需要将其移至结构中。当我尝试执行此操作时,无法在结构中再次访问这些值,并且需要一些帮助。

这是我的缓冲区:

void* mybuff[8][16384];

我想在这样的结构中存储指向此2D数组的指针:

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进一步说明要放入结构中的数据的形状,但是我还不太想办法做到这一点。感谢您在此提供的任何帮助或见解。

3 个答案:

答案 0 :(得分:2)

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

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]);

答案 1 :(得分:1)

冒着使您走得更远的风险:

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

但是void *的一般性质是通用类型,这与多维数组相反。出现该类型后,此代码看起来很奇怪,并且可能还有其他错误。

答案 2 :(得分:1)

这里是如何存储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),以便取消引用值。为了简洁起见,我在示例中没有进行边界检查,但是您应该在真实的代码中进行检查。