我有一个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进一步说明要放入结构中的数据的形状,但是我还不太想办法做到这一点。感谢您在此提供的任何帮助或见解。
答案 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),以便取消引用值。为了简洁起见,我在示例中没有进行边界检查,但是您应该在真实的代码中进行检查。