首页 文章

C,结构指针的赋值改变了赋值右侧的内容

提问于
浏览
-3

我有以下结构:

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的1stbyte的值为-96,而不管它之前打印的值是什么(与数据中的memcpy-d相同) . 如果我在将指针添加到指针(第2个字节)之前将其加1,它总是给出32,如果我加2(第3个字节)它总是给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 回答

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

相关问题