Сначала вам нужно решить, что именно вы пытаетесь сделать.
Если вы хотите иметь структуру с указателем на [независимый] массив внутри, вы должны объявить ее как
struct my_struct {
int n;
char *s;
};
В этом случае вы можете создать реальный объект структуры любым удобным вам способом (например, автоматической переменной)
struct my_struct ms;
и затем выделять память для массива независимо
ms.s = malloc(50 * sizeof *ms.s);
На самом деле, нет общей необходимости динамически выделять память массива
struct my_struct ms;
char s[50];
ms.s = s;
Все зависит от того, какой срок жизни вам нужен от этих объектов. Если ваша структура автоматическая, то в большинстве случаев массив также будет автоматическим. Если объект struct владеет памятью массива, просто нет смысла делать иначе. Если сама структура является динамической, то массив также обычно должен быть динамическим.
Обратите внимание, что в этом случае у вас есть два независимых блока памяти: структура и массив.
Совершенно другим подходом было бы использование идиомы "struct hack". В этом случае массив становится неотъемлемой частью структуры. Оба находятся в одном блоке памяти. В C99 структура будет объявлена как
struct my_struct {
int n;
char s[];
};
и для создания объекта вам нужно динамически распределить все это
struct my_struct *ms = malloc(sizeof *ms + 50 * sizeof *ms->s);
Размер блока памяти в этом случае рассчитывается для размещения членов структуры и конечного массива во время выполнения.
Обратите внимание, что в этом случае у вас нет возможности создавать такие объекты структуры, как статические или автоматические объекты. Структуры с гибкими элементами массива в конце могут быть динамически размещены только в C.
Ваше предположение о том, что арифметика указателей быстрее, чем массивы, абсолютно неверно. Массивы работают по арифметике указателей по определению, поэтому они в основном одинаковы. Более того, подлинный массив (не распавшийся на указатель) обычно немного быстрее объекта указателя. Значение указателя должно быть прочитано из памяти, а расположение массива в памяти «известно» (или «вычислено») из самого объекта массива.