3 вида массивов
Правильно ли объявлены структуры? Нужно объявить 3 структуры, содержащие массивы string и int: 1) Статические 2) Динамические 3) С помощью указателей. Правильно ли я сделал?
#include <iostream>
using namespace std;
struct staticArray
{
string string1[2];
int int1[2];
};
struct dynamicArray
{
size_t N = 2;
string string2[N];
int int2[N];
};
struct pointerArray
{
string* string3[1];
int* int3[];
};
Ответы (3 шт):
Пункты 1) и 2) разный синтаксис одного и того же.
Тип данных string - это контейнер. Скорее всего речь идет о С-строках, т.е. массивах char[];
Нужно уточнить что вы понимаете под терминами "статический" и "динамический" массив?
Статическими или динамическими являются объекты, которые располагаются в разной памяти.
Статический объект - если объявлен в глобальной области видимости, в области видимости пространства имен или в качестве статического члена класса, то он размещается в статической памяти. Объектам, объявленным локально, память выделяется на стеке. Нестатические члены класса размещаются в границах экземпляра класса. Динамические объекты размещаются в динамической памяти - куче.
Т.е. всё зависит не от объявления массива в структуре, а как Вы будете создавать объекты (экземпляры) этих структур.
struct oneArray
{
char string1[10];
int int1[2];
};
oneArray obj1; // объект в глобальной видимости, в статической памяти, массивы тоже
main()
{
oneArray obj2; // объект на стеке
oneArray *obj3 = new(oneArray); // объект в куче
delete obj3;
}
Вот так будет всегда статический массив, независимо от метода создания объекта структуры:
struct oneArray
{
static char string1[10]; // массив будет статическим и будет 1 экземпляр массива для всех объектов этой структуры, независимо от того, как создан объект
int int1[2];
};
А вот так массивы будут всегда динамическими, независимо от того, где создаётся объект структуры:
struct oneArray
{
char *string1;
int *int1;
};
main()
{
oneArray obj1; // объект на стеке
obj1.string1 = new char[10]; // а массивы в куче!
obj1.int1 = new int[20];
// и не забыть освободить память через delete !!!
}
Но повторюсь, что имелось ввиду в условиях задачи под терминами "статический" и "динамический"?
Нет, это неправильно.
Статический массив - массив который будет иметь определённый до компиляции размер. Он не может меняться во время работы программы.
Динамический массив - массив который под который была выделена память из кучи. Так же он может менять свой размер во время работы программы. Минусы - выделением лучше не злоупотреблять - выделение памяти динамически довольно затратная по ресурсам ПК вещь. После работы с ним его нужно очищать. (Вообще лучше использовать "умные" указатели, они сами очищают память с помощью деструктора)
Теперь как это сделать:
Структура с статическими массивами:
#include <iostream>
#include <string>
using namespace std;
struct staticsArray
{
string strArray[5]; // Эти массивы статичны. Количество элементов в них определено до компиляции и не изменяться
int intArraryp[5];
};
Структура с динамическими массивами:
#include <iostream>
#include <string>
using namespace std;
struct dynamicsArray
{
string* strArray = new string[5]; // Эти массивы динамические. Вы можете указать количество элементов при выполнении программы. (ВАЖНО: new и malloc возвращают указатели, или же сам массив. Так как массив - это указатель на первый его элемент)
int* intArray = new int[5];
~dynamicsArray() // Это деструктор. Компилятор автоматически добавит его вызов когда структура будет не нужна и все динамические массивы удаляться. (Это необходимо делать, так как память которая была выделена не освобождается автоматически)
{
delete[] strArray;
delete[] intArray;
}
};
Структура с помощью указателей
#include <iostream>
#include <string>
using namespace std;
// Вообще, я не до конца понял, что именно требуется. Код ниже сделает указатель на указатель
struct pointerArray
{
string strArray[5];
int intArray[5];
void* pointerArray = &strArray;
void* pointerArray = &intArray;
};
Если я правильно понимаю задание, то речь идёт о таких структурах (второй вариант - дичь): tio.run
#include <cstdlib>
#include <iostream>
using namespace std;
struct smth1 {
int data[3];
};
struct smth2 { // Never do so!
int size;
int data[0];
};
struct smth3 {
int size;
int *data;
};
int main()
{
smth1 a;
a.data[0] = 10;
a.data[1] = 11;
a.data[2] = 12;
smth2 &b = *(smth2 *)malloc(sizeof (smth2) + 3 * sizeof (int));
b.size = 3;
b.data[0] = 20;
b.data[1] = 21;
b.data[2] = 22;
smth3 c;
c.size = 3;
c.data = new int[3] { 30, 31, 32 };
for (int q=0; q<3; ++q)
cout << q << ' ' << a.data[q] << ' ' << b.data[q] << ' ' << c.data[q] << endl;
free(&b);
delete c.data;
}
Вообще, для третьей структуры можно сделать конструктор и деструктор довольно очевидным образом. А вот как облагородить вторую - я без понятия. Возможно, надо перегружать operator new. Задал вопрос об этом. Ну и подобный массив в ней может быть только один - два одновременно никак не поместить.