c - 尝试取消引用通用指针。

标签 c debugging pointers segmentation-fault gdb

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

我编写这个函数来帮助处理一些 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]仅仅因为 destvoid*

您的复制功能似乎很奇怪。在主代码中,您花费了大量精力来计算字节偏移量,但您仍然使用 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/

相关文章:

c++ - 将 matlab 函数转换为 C/C++

Android Debugger 遍历每堂课

c - 为什么我在这个程序中没有看到多线程带来的任何加速?

c - char *(arr[5]) 和 char (*arr)[5] 之间的区别

c - 如何避免在这个递归函数中使用malloc?

c - 默认 Argv 参数类型

javascript - 维护JS调试代码并重新加载浏览器

C++ 函数返回 const char *

c++ - 与指针的组成

c - 为什么我的代码在 Visual 中不起作用,但在 CodeBlocks 中却可以?