C结构数组

时间:2011-02-05 17:18:54

标签: c arrays struct

如果我在C中创建一个结构并想将它们添加到一个未设置为固定大小的数组,那么该数组是如何创建的?

是否可以创建一个tempStruct,在每次迭代时使用,同时获取用户输入并将其存储在数组中,始终在循环中使用相同的tempStruct结构?

如果大小未知因为它取决于用户输入,以及如何将结构添加到此数组中,如何创建数组?

4 个答案:

答案 0 :(得分:0)

是的,您可以在输入期间使用tempStruct,稍后将其添加到数组中。

如果阵列的大小未知,那么你就麻烦了。你必须在某处跟踪数组的大小。只要有一个整数变量,每次更改数组时都要更改该变量,以跟踪数组的大小。

如果在编译时不知道结构的大小,那就更复杂了。您只需将指针存储在指向内存中实际struct元素的数组中,或者您必须跟踪数组中每个结构的大小。在后一种情况下,您必须在数组中完全手动计算很多。虽然这非常有效,但它也很容易出错并且很难调试。

行。使用指针创建一个包含结构的数组的示例:

struct MyStruct
{
  /* code */
}

main()
{
  counter = 0;
  struct MyStruct** array = malloc(counter);
  // Create new Element
  struct MyStruct myElement;
  myElement.someData = someValue;

  // Add element to array:
  array = realloc(array, sizeof(struct MyStruct*) * (counter + 1);
  array[counter] = &myElement;
  counter++;

  // Create yet another new Element
  struct MyStruct myElement;
  myElement.someData = someOtherValue;
  array = realloc(array, sizeof(struct MyStruct*) * (counter + 1);
  array[counter] = &myElement;
  counter++;

  // Now remove the last element
  free(array[counter -1]); // may have something more complicated than that, depending on your struct
  array = realloc(array, sizeof(struct MyStruct*) * (counter - 1);
  counter--;
}

此代码未经过测试!

答案 1 :(得分:0)

当编译时大小未知时,您需要在堆上分配内存,而不是在数据段(存储全局变量的位置)或堆栈(存储函数参数和局部变量)上分配内存)。在C中,您可以通过调用malloc等函数来完成此操作。

MyStructType *myArray = (MyStructType *)malloc(numElements * sizeof(MyStructType)
... do something ...
free(myArray)

如果您正在使用C ++,通常最好使用new []和delete [],例如。

MyStructType *myArray = new MyStructType[numElements]
... do something ...
delete [] myArray

请注意,new []必须与delete []配对。如果您要分配单个实例,请使用new和delete(不带“[]”)。删除[]和删除不等效。

此外,如果您使用的是C ++,使用STL矢量通常会更容易,更安全。

答案 2 :(得分:0)

C数组必须是固定大小的,这是我们多年前学到的 但内存分配功能可以帮助您找到解决方案

在c ++中你可以使用operator new

int num=0;
cout<<"please enter the number"<<endl;
cin>>num;
int *x=new int[num];
for(int i=0;i<num;i++)
{
   cout<<"enter element "<<(i+1)<<endl;
   cin>>x[i];
}
//do your work

   Fooz先生

提到delete []用于释放new []分配的内存 这是一个通用的例子

答案 3 :(得分:0)

如果您使用的是较旧的C89标准编译器,则不能使用可变长度数组。如果使用C99,则可以创建可变长度数组。为了澄清:变量长度并不意味着数组长度可以在执行期间改变。它只是意味着您可以在执行期间设置它,而不是在编译期间修复值。

例如:

CreateArray(const int numberOfElements)
{
       struct MyStruct arrayOfStructs[numberOfElements];
}

这在C99中有效,但在C89中无效。检查编译器文档。