我有以下程序通过双指针引用数组元素。
typedef struct {
int num1;
int num2;
int num3;
} DATA_SET;
typedef struct {
int structID;
DATA_SET *data_set_array; // Pointer to an array of DATA_SET structs
} MY_STRUCT;
int main () {
MY_STRUCT *Struct1;
DATA_SET **DataSetArray; // Array of pointers
Struct1 = malloc(sizeof(MY_STRUCT));
Struct1->data_set_array = malloc(sizeof(DATA_SET*)) //Allocate mem for the pointer to array of DATA_SETs
DataSetArray = malloc(sizeof(DATA_SET*) * 2) // Allocate mem for an array of 2 DATA_SET pointers
DataSetArray[0] = malloc(sizeof(DATA_SET)) // Allocate mem for the actual DATA_SET struct
DataSetArray[0]->num1 = 1;
DataSetArray[0]->num2 = 2;
DataSetArray[0]->num3 = 3;
DataSetArray[1] = malloc(sizeof(DATA_SET)) // Allocate mem for the actual DATA_SET struct
DataSetArray[1]->num1 = 1;
DataSetArray[1]->num2 = 2;
DataSetArray[1]->num3 = 3;
memcpy(Struct1->data_set_array, *DataSetArray, sizeof(DATA_SET*); //Copy data set array into Struct1
当我在Struct1中打印出所有数据时,我得到:
Struct1->data_set_array[0].num1 = 1
Struct1->data_set_array[0].num2 = 2
Struct1->data_set_array[0].num3 = 3
Struct1->data_set_array[1].num1 = 50 //This should be 1
Struct1->data_set_array[1].num2 = 50 //This should be 2
Struct1->data_set_array[1].num3 = 65 //This should be 3
似乎是数组中第二个元素的误用/数据损坏。
我知道可能有不同的方法可以做到这一点,但我想熟悉通过双指针引用数组索引。我正确分配内存吗?我觉得memcpy是不正确的。
答案 0 :(得分:0)
Struct1->data_set_array = malloc(sizeof(DATA_SET*)
/* ^ wrong */
DataSetArray = malloc(sizeof(DATA_SET*) * 2)
/* ^ wrong */
您需要执行sizeof(DATA_SET)
,因为这是结构的实际大小,而不是指向DATA_SET
结构的指针。
你错误地只分配指针的大小为2,这在很多情况下可能比你希望的要小。
memcpy(Struct1->data_set_array, *DataSetArray, sizeof(DATA_SET*);
这也是错误的。您必须复制sizeof(DATA_SET)
。请记住,sizeof(DATA_SET)不等于sizeof(DATA_SET *)。无论指针的类型如何,指针的大小(以字节为单位)都是相同的。
答案 1 :(得分:0)
我动态分配的结构指针数组有什么问题?
DataSetArray
是一个指向struct的指针数组,不有任何错误。
问题还有其他两件事:
你不能在指向struct的数组上使用memcpy
。记忆不是连续的。
此外,data_set_array
不是指向struct的指针数组,因此您尝试在不兼容的类型之间进行复制。
答案 2 :(得分:-1)
我猜你基本上想要创建一个Double Dimension数组。所以基本上你可以做这样的代码
struct abc {
int i;
};
struct abc **arr;
arr = (struct abc **) malloc(sizeof(struct abc) * 2);
arr[0] = (struct abc*)malloc(sizeof(struct abc));
arr[0]->i = 100;
arr[1] = (struct abc*)malloc(sizeof(struct abc));
arr[1]->i = 200;
你需要记住的一件事是外部数组只是一个指针,因此它不需要是sizeof(abc),它很可能是sizeof(int *)/ sizeof(void * )等等。
所以基本上上面的代码可以写成
struct abc **arr;
arr = (struct abc **) malloc(sizeof(int *) * 2);
arr[0] = (struct abc*)malloc(sizeof(struct abc));
arr[0]->i = 100;
arr[1] = (struct abc*)malloc(sizeof(struct abc));
arr[1]->i = 200;
希望这有助于您想要对代码进行基础内存管理