C、结构体指针的赋值改变了赋值右边的内容

标签 c pointers struct void-pointers assignment-operator

我有以下结构:

typedef struct{
    char *name;
    int size;
    void *data;
} Struct1;
typedef struct st2{
    char *name;
    struct st2 **Struct2array;
    Struct1 **Struct1array;
    int Struct1_n;
    int Struct2_n;
} Struct2;

其中 Struct2 中的双指针用作指向其他 Struct2 或 Struct1 的指针的动态数组。 Struct1中的数据作为动态数组来存储一些数据。 Struct1_n 和 Struct2_n 表示各自动态数组内的元素数量。

当我创建 Struct1 类型的变量时,我通过将 char * 转换为 void * 并使用 memcpy 将其复制到 data 来填充数据。如果我然后将数据转换回 char 指针,我可以取回内容,并且它们通常是相同的。但是,由于某种原因,Struct1 中的数据指向的值在以下行之后发生更改:

struct2pointer->Struct1array[struct2pointer->Struct1_n - 1] = struct1pointer;

示例:

printf("%d\n", *(char *)(struct1pointer->data));

在有问题的行之后立即将 struct1pointer->data 的第一个字节的值给出为 -96,无论它之前打印的值是什么(与 memcpy-d 到数据中的值相同)。如果我在将指针转换为 char 指针(第二个字节)之前向指针添加 1,它总是给出 32,如果我添加 2(第三个字节),它总是给出 96,依此类推。

当 struct1pointer 位于赋值运算符的右侧时,为什么会发生这种情况?可以采取哪些措施来解决此问题?

编辑:

内容发生变化的函数:

void struct2_addstruct1(Struct2 struct2pointer, Struct1 *struct1pointer){
    struct2->Struct1_n++;
    struct2pointer->Struct1array = realloc(struct2pointer->Struct1array, struct2->Struct1_n * sizeof(Struct1 *)); //edited to remove increment that was added on accident, isn't in the original code
    struct2pointer->Struct1array[struct2pointer->Struct1_n - 1] = struct1pointer;
}

创建Struct1的函数:

void struct1_init(Struct1 *s, char *name, void *data, int size){
  s->name = malloc(strlen(name) + 1);
  strcpy(s->name, name);

  s->size = size;

  s->data = malloc(size);
  memcpy(s->data, data, size);
}

这是创建 struct1 时调用该函数的方式:

Struct1 *s;
struct1_init(s, name, data, size);

名称、数据和大小是从外部提供的,但不应与问题有任何关系。

最佳答案

看看这段代码:

Struct1 *s;
struct1_init(s, name, data, size);

此处s未初始化。

但是,在 struct1_init 函数中,您确实假设指针 s 已经指向 Struct1

也许您忘记了 malloc - 例如:

Struct1 *s = malloc(sizeof *s);
struct1_init(s, name, data, size);

关于C、结构体指针的赋值改变了赋值右边的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51039627/

相关文章:

C 分配二维数组

c - 编写并使用一个将掩码作为参数并返回结构的函数

c - 双向链表工作不正常

c++ - 添加 'union' 关键字对预定义结构的影响

c - 指向分配给二维数组的指针的指针,指向错误的地址

c - C 中非常简单的 map 实现(用于指导目的)?

c - 使用指针作为 C 调用 Prolog Process 的参数的奇怪情况

c++ - 指针 vector 的运算符<<重载抛出错误

c - 尝试读取结构元素时的 if 情况

c - 难以访问嵌套的 C union 成员