如果我在C中创建一个结构并想将它们添加到一个未设置为固定大小的数组,那么该数组是如何创建的?
是否可以创建一个tempStruct,在每次迭代时使用,同时获取用户输入并将其存储在数组中,始终在循环中使用相同的tempStruct结构?
如果大小未知因为它取决于用户输入,以及如何将结构添加到此数组中,如何创建数组?
答案 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中无效。检查编译器文档。