我正在尝试直接处理一些低级内存的东西。我正在用一些数据填充缓冲区,然后将其复制到更大的缓冲区。
我编写这个函数来帮助处理一些 float 据:
void copy_float_buffer(void* dest, size_t dest_index, void* src,
size_t src_index, size_t num_to_copy) {
memcpy(&dest[dest_index], &src[src_index], num_to_copy * sizeof(float));
}
我目前有两种不同的缓冲区,每种类型各有两种。
float buffa[12]; // i have two of these
float buffb[12]; // and two of these as well
然后有两个较大的缓冲区,将这些缓冲区背靠背。 float 缓冲区[24];//持有2个buffa float bufferb[24]//持有2个buffb
我有一个简单的 for 循环,它执行一些计算并填充 buffa 和 buffb,然后我使用 copy_float_buffers 命令来填充缓冲区。我是这样做的。
typedef struct {
float buffa[12];
float buffb[12];
} buffs;
buffs* b;
for (int j = 0; j < 2; j++) {
b = calloc(1, sizeof(buffs));
}
for (int i = 0; i < 12; i++) {
b->buffa[i] = vmathRandRange(21);
b->buffb[i] = vmathRandRange(21);
}
for (int i = 0; i < 12; i++) {
/* printf("index:%d value:%f \n", i, b->buffa[i]); */
/* b->buffa[i] = vmathRandRange(21); */
copy_float_buffer(v_buff, (sizeof(float) * i) * 12, b->buffa,
(sizeof(float) * i) * 12, 12);
copy_float_buffer(v_buff, (sizeof(float) * i) * 12, b->buffb,
(sizeof(float) * i) * 12, 12);
}
print_buffer(b->buffa, "original buffer");
print_buffer(v_buff, "vertex buffer");
print_buffer(b->buffb, "original buffer");
print_buffer2(v_buff, "vertex buffer");
print_buffers 函数只是循环 0-11 或 12-22 并打印出值。
我觉得这是一个指针数学问题,我正在使用 gdb 尝试查看代码并查看它是如何被复制的,但我遇到了上面的错误。
Attempt to dereference a generic pointer.
在单步执行 gdb 和 also 中的代码时如何取消引用指针。我认为执行内存复制的功能设置正确。但它似乎只是覆盖前 12 个 float 或前 48 个字节,而不是实际移动,类似于环形缓冲区。
最佳答案
正如评论中已经提到的,你不能做 dest[dest_index]
仅仅因为 dest
是 void*
您的复制功能似乎很奇怪。在主代码中,您花费了大量精力来计算字节偏移量,但您仍然使用 sizeof(float)
在copy_float_buffer
里面功能。您应该编写函数以在所有地方使用 float 或在所有地方使用字节 - 这将更容易理解。
因为函数被称为copy_float_buffer
它表明你想复制 float ,所以它应该是:
void copy_float_buffer(float* dest, size_t dest_index, float* src,
size_t src_index, size_t num_to_copy) {
memcpy(&dest[dest_index], &src[src_index], num_to_copy * sizeof(float));
}
复制num_to_copy
float 。如果你这样做,你需要改变你调用函数的方式,即摆脱所有的字节偏移量计算。像这样的东西:
copy_float_buffer(v_buff, 0, b->buffa, 0, 12); // Ends in v_buff[0..11]
^ ^ ^
| | Copy 12 floats
| Start offset in buffa
Start offset in v_buff
copy_float_buffer(v_buff, 12, b->buffb, 0, 12); // Ends in v_buff[12..23]
^ ^ ^
| | Copy 12 floats
| Start offset in buffb
Start offset in v_buff
您的其余代码也有一些问题:
// You loop twice but simply overwrite `b` the second time
// so you leak memory
for (int j = 0; j < 2; j++) {
b = calloc(1, sizeof(buffs));
}
// Why do you loop 12 times?
// Do you want to copy the data in to the main buffer 12 times?
for (int i = 0; i < 12; i++) {
// The two call of copy_float_buffer is identical except for buffa and buffb
// So buffb will overwrite buffa
// Probably not what you want or ...?
copy_float_buffer(v_buff, (sizeof(float) * i) * 12, b->buffa,
(sizeof(float) * i) * 12, 12);
copy_float_buffer(v_buff, (sizeof(float) * i) * 12, b->buffb,
(sizeof(float) * i) * 12, 12);
}
关于c - 尝试取消引用通用指针。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34728881/