尝试取消引用通用指针。

时间:2016-01-11 18:51:26

标签: c debugging pointers segmentation-fault gdb

我正在尝试直接使用一些低级内存。我正在用一些数据填充缓冲区,然后将其复制到更大的缓冲区。

我写了这个函数来帮助一些浮点数据:

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

然后有两个较大的缓冲区,将这些缓冲区背对背。     漂浮buffera [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中逐步执行代码时取消引用指针。我认为正确设置了执行内存复制的功能。但它似乎只覆盖了前12个浮点数或前48个字节而实际上没有移位,就像环形缓冲区一样。

1 个答案:

答案 0 :(得分:3)

正如评论中已经提到的,您不能仅仅因为dest[dest_index]dest

void*

您的复制功能似乎很奇怪。在主代码中,您需要花费大量精力来计算字节偏移,但仍然在sizeof(float)函数中使用copy_float_buffer。您应该编写函数以在任何地方使用浮点数或在任何地方使用字节 - 这将更容易理解。

由于该函数被称为copy_float_buffer,它表示您要复制浮点数,因此它应该是:

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个浮点数。如果你喜欢这样,你需要改变你调用函数的方式,即摆脱所有的字节偏移量计算。类似的东西:

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