2016-06-06 4 views
-1

Я построил функцию, которую я пытаюсь использовать для динамического выделения памяти для моей структуры. Просто не могу заставить его работатьВ C, как мне выделить место для моей структуры?

typedef struct My_Struct 
{ 
    char **array 
}MyStruct 

MyStruct * createMyStruct(int length) 
{ 
    MyStruct->array = malloc(sizeof(char *) * (length + 1)); 
} 

int main(void) 
{ 
    MyStruct *new1 = createMyStruct(10); 
    return 0; 
} 
+3

Вы не можете использовать 'MyStruct-> array'. 'MyStruct' - это имя типа, а не имя переменной. – Barmar

+0

Вы не выделяете свою структуру, но можете выделять экземпляры своей структуры. – immibis

ответ

0

Вы не можете использовать MyStruct типа для инициализации своих полей, так как они не являются статичными. Сначала нужно создать экземпляр структуры, инициализировать его, а затем - вернуться из вашего метода.

MyStruct * createMyStruct(int length) 
{ 
    MyStruct* pResult = malloc(sizeof(MyStruct)); 
    pResult->array = malloc(sizeof(char *) * (length + 1)); 
    return(pResult); 
} 

Не забывайте освобождать память после того, как закончите использовать ее.

PS: Этот код также странно:

pResult->array = malloc(sizeof(char *) * (length + 1)); 

Если вы пытаетесь инициализировать массив строк одинаковой длины, это неверно. Вы получите массив из length+1, содержащий неинициализированные указатели. Если вы просто выделили массив для использования его позже, то приращение length возможно неверно.

+0

Это, вероятно, должно стать разреженным массивом «строк», при этом указательный массив заканчивается «NULL» (например, 'argv' в' main() '), поэтому элемент +1 будет для дозорного. – alk

+0

Может быть, но это непонятно из вопроса. Поэтому я подумал, что лучше указать) – Ari0nhh

+0

Также было бы важно выполнить проверку ошибок при вызовах 'malloc()'. – alk

1

Это просто, как выделение sizeof(MyStruct) и приведение к MyStruct PTR:

MyStruct * createMyStruct(int length) 
{ 
    MyStruct* s = malloc(sizeof(MyStruct)); 
    s->array = malloc(sizeof(char*) * (length + 1)); 
    return s; 
} 

Кстати, как правило, структура не имеет каких-либо указателей в нем, но только массивы с фиксированными размерами или по крайней мере char*[] вместо char*, так как структуры обычно имеют фиксированный размер, который будет легче распределяться. Если вы используете мой код выше не забудьте выделить char* х годов char** относится тоже, так как таНос в моем коде только выделяет указатели, а не строки itselfes

+2

'(MyStruct *)' и '(char **)' не нужны. – immibis