我动态分配的结构指针数组有什么问题?

时间:2016-10-06 04:21:00

标签: c arrays pointers dynamic

我有以下程序通过双指针引用数组元素。

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是不正确的。

3 个答案:

答案 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;

希望这有助于您想要对代码进行基础内存管理