C,结构指针的赋值会改变赋值右边的内容

时间:2018-06-26 09:38:51

标签: 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将其复制到数据中来填充数据。如果然后将数据强制转换回char指针,则可以获取内容,并且它们通常是相同的。但是,由于某些原因,Struct1中的数据指向的值在以下行之后更改:

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

示例:

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

在有问题的行之后立即将struct1pointer-> data的第1个字节的值设为-96,而不管它之前立即打印的值(与数据中的同一memcpy-d相同)。如果我在将其强制转换为char指针(第二个字节)之前在指针上加1,则始终为32,如果我将2(第三个字节)加为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);

名称,数据和大小是从外部提供的,但与该问题无关。

1 个答案:

答案 0 :(得分:1)

看下面的代码:

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