Что-то вроде этого должно работать, хотя оно не является отличным решением с большим количеством отдельных распределений, а дальше - лучшее решение. Я попытался сделать имена переменных, описывающие, что они держат.
int arrayOfSubArrayLengths={9,5,10,50,...};
int lengthOfMyMatrix=something;
myMatrix= (myArray*) malloc(sizeof(myArray) * lengthOfMyMatrix);
for(int i=0; i<lengthOfMyMatrix; ++i)
{
myMatrix[i].elements=new myElement[arrayOfSubArrayLengths];
myMatrix[i].someData=whatever;
}
удалить:
for(int i=0; i<lengthOfMyMatrix; ++i)
{
free(myMatrix[i].elements);
}
free(myMatrix);
Однако, как я сказал, что не является отличным решением с таким количеством распределений. Это может привести к серьезной фрагментации памяти в зависимости от того, насколько велика lengthOfMyMatrix. Также так много вызовов в распределитель может замедлить работу в зависимости от размера lengthOfMyMatrix. Вот лучшее решение:
int arrayOfSubArrayLengths={9,5,10,50,...};
int lengthOfMyMatrix=something;
int sumOfSubArrayLengths=someNumber;
myArray* fullArray=(myElement*) malloc(sizeof(myElement) * sumOfSubArrayLengths);
myMatrix= (myArray*) malloc(sizeof(myArray) * lengthOfMyMatrix);
int runningSum=0;
for(int i=0; i<lengthOfMyMatrix; ++i)
{
myMatrix[i].elements = &fullArray[runningSum];
runningSum += arrayOfSubArrayLengths[i];
myMatrix[i].someData = whatever;
}
удалить:
free(fullArray);
free(myMatrix);
В моде не только два обращения к распределителю независимо от того, различные длины. Таким образом, существует гораздо больше фрагментации памяти и меньше затрат времени на распределение. Единственный недостаток второго метода заключается в том, что если вы не будете осторожны с проверкой границ, очень легко испортить данные в массиве, не зная, так как память «принадлежит» вам, и, следовательно, ОС не будет бить вас за нарушение доступа ,
С [ '' malloc' и free'] (http://linux.die.net/man/3/malloc) –