使用指向结构的指针分配,填充和操作指针数组

时间:2017-07-24 17:11:49

标签: c pointers calloc

使用指向结构的指针分配,填充和操作指针数组

我有一个测试列表,但不知道开始时的测试次数。 测试次数和每个测试的内容将来自数据库。 测试顺序应易于更改,测试应单独删除/插入序列中。

由于我可以确定查询数据库的测试次数,我想首先分配一个指向所有测试的指针数组,然后分别为每个测试分配内存。 通过这个我可以通过交换指向测试的指针来重新排序序列,并且还能够将新测试移除或插入到序列中。

我写了一个小程序,可以用gdt快速检查。

遗憾的是,编译器不接受将测试(已分配的mem)分配给指针数组(也分配了mem)。

#define MAX_TEST_NAME                100

typedef struct sTestT
{
  char                      cTested;                             // Output of this Test
  char                      cEnabled;                            //
  char                      cName[MAX_TEST_NAME+1];
} sTest;


void main(int argc, char **argv)
{
  printf ("Double Pointer Test for GDB\n");

  int i,j;
  i = 7;                                             // A random number for this program, to be able to change it with gdb

  sTest*  psTestPtr;
  sTest*  psTestPtrArray;
  sTest*  psTestPtrArrayOriginal;

  // We first allocate an array of pointers to the Tests, NOT an array of the Tests
  psTestPtrArray = calloc (i, sizeof(sTest*));       // allocate the pointer array
  psTestPtrArrayOriginal = psTestPtrArray;           // store original pointer to free memory later


  // Now we allocate each test seperatly and let the psTestPtrArray point to the test
  for (j=0; j<i; j++)
  {
    // Now we allocate ONE trigger each time to be able to free them seperately
    psTestPtr = calloc (1, sizeof(sTest));
    psTestPtr->cTested = j;
    *psTestPtrArray = &psTestPtr;                    // <-------------- Does NOT compile
    psTestPtrArray++;                                // Next pointer to another Test
  }

  // Working with test omitted

  // Free Tests and pointer array
  psTestPtrArray = psTestPtrArrayOriginal;           // Restore initial pointer to be able to walk through array
  for (j=0; j<i; j++)
  {
    free (*psTestPtrArray);                          // <-------------- Does NOT compile
    psTestPtrArray++;
  }

  free (psTestPtrArray); 
} // main

有什么建议吗?

感谢。 赖

1 个答案:

答案 0 :(得分:0)

您正在声明错误类型的变量。当您分配它们时,您应该有自解释错误。

sTest*  psTestPtr;        //pointer to a sTest
sTest**  psTestPtrArray;  //Pointer to an array of pointers to sTest
sTest**  psTestPtrArrayOriginal; //same as above

并且

*psTestPtrArray = &psTestPtr;      

应该是

*psTestPtrArray = psTestPtr;

因为psTestPtr已经是指向sTest的指针。不需要取其地址。 如果使用数组索引为每个sTest分配内存而不是递增指针变量,那么它会更容易。