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 шт):

Автор решения: DmitryK

Пункты 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 !!!
}

Но повторюсь, что имелось ввиду в условиях задачи под терминами "статический" и "динамический"?

→ Ссылка
Автор решения: bloody

Нет, это неправильно.

Статический массив - массив который будет иметь определённый до компиляции размер. Он не может меняться во время работы программы.

Динамический массив - массив который под который была выделена память из кучи. Так же он может менять свой размер во время работы программы. Минусы - выделением лучше не злоупотреблять - выделение памяти динамически довольно затратная по ресурсам ПК вещь. После работы с ним его нужно очищать. (Вообще лучше использовать "умные" указатели, они сами очищают память с помощью деструктора)

Теперь как это сделать:

Структура с статическими массивами:

#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;
};

→ Ссылка
Автор решения: Qwertiy

Если я правильно понимаю задание, то речь идёт о таких структурах (второй вариант - дичь): 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. Задал вопрос об этом. Ну и подобный массив в ней может быть только один - два одновременно никак не поместить.

→ Ссылка