C、struct指针的赋值改变了赋值右边的内容
C, assignment of struct pointers changes the content of the right side of assignment
我有以下结构:
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 的第一个字节的值给出为 -96,而不管它之前打印的值是什么(与 memcpy-d 到数据中的值相同)。如果我在将指针转换为 char 指针(第 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);
名称、数据和大小是外部提供的,但与问题无关。
看这段代码:
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);
我有以下结构:
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 的第一个字节的值给出为 -96,而不管它之前打印的值是什么(与 memcpy-d 到数据中的值相同)。如果我在将指针转换为 char 指针(第 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);
名称、数据和大小是外部提供的,但与问题无关。
看这段代码:
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);