c - 插入和操作结构体指针的动态数组

标签 c pointers memory-management struct

这是我正在尝试做的事情:
1. 创建一个结构体指针数组。
2. 使用 malloc 的结构填充数组。
3. 然后用新的 malloc 结构体替换数组中的一个元素
4.没有内存泄漏。

我在下面编写了一个测试程序,但由于对 memcpy 的调用无效读取和写入,出现了段错误。我做错了什么?

#include <stdlib.h>
#include <string.h>
struct my_struct {
    int a;
    int b;
};
int main(int argc, char *argv[])
{
    struct my_struct **my_arr;
    my_arr = (struct my_struct **) malloc(10 * sizeof(struct my_struct *));
    int i;
    for (i = 0; i < 10; i++) {
        struct my_struct *my_str = (struct my_struct *) malloc(sizeof(struct my_struct *));
        my_arr[i] = my_str;
    }
    free(my_arr[0]);
    memcpy(my_arr[0], my_arr[1], sizeof(struct my_struct *) * 9);
    my_arr[9] = (struct my_struct *) malloc(sizeof(struct my_struct *));
    for (i = 0; i < 10; ++i) {
        free(my_arr[i]);
    }
    free(my_arr);
}

最佳答案

free(my_arr[0]);
memcpy(my_arr[0], my_arr[1], sizeof(struct my_struct *) * 9);

这是问题,您首先free(my_arr[0]),然后将my_arr[1]复制到它指向的地址。

释放内存后您不应该访问它。 并且也在 manpage 中指定

[...]The memory areas must not overlap. Use memmove if the memory areas do overlap.

你再次这样做 -

   my_arr[9] = (struct my_struct *) malloc(sizeof(struct my_struct *));

因此,失去了对其指向的先前内存块的引用。

关于c - 插入和操作结构体指针的动态数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33295154/

相关文章:

iphone - 在滚动条中显示多张照片

c - 如何将变量插入 sscanf 字符串?

c - 一次从一个结构中读取字节

python - 如何创建 Python 不会释放的缓冲区?

C++ - 将指针存储在字节数组中?

c - 指向静态分配结构的全局指针

c++ - 在初始化指向同一数组的指针之前初始化数组

objective-c - 为什么变量的行为如此奇怪?

c - 如何通过C代码确定内存大小

c - 如何在 FreeBSD 中调试 malloc/memleaks