2015-03-10 2 views
1

Мне нужно сделать машину adfgx (Code language from WWII) для проекта в школе. Но у меня проблемы.Выделить память для структуры в функции

Существует на структуру наряду с некоторыми функциями, определенными в adfgx.h, который выглядит следующим образом:

typedef struct { 
    char* alphabet;   
    char* symbols;   
    char* dictionary;  
    char* transposition;  
} adfgx; 

В adfgx.c мы включаем заголовок, и я должен написать функцию, которая выделяет память для этой структуры с предопределенной подписью:

/* Creates a new ADFGX machine */ 
adfgx* create_adfgx(const char* alphabet, const char* symbols, const char* dictionary, const char* transposition); 

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

ответ

1

Я теперь не размер алфавита, символы, словарь и транспозиции

Поскольку размер не передается внутри, API должны предполагать, что const char* параметры представляют собой строки C. Это позволяет вычислить желаемый размер, вызывая strlen и добавляя его к результату для нулевого терминатора.

Чтобы избежать делать то же самое несколько раз, я предлагаю определить свою собственную функцию для строки дублирования:

static char *duplicate(const char *s) { 
    if (s == NULL) return NULL; 
    size_t len = strlen(s)+1; 
    ... // Call malloc, check results, make a copy 
    return res; 
} 

Теперь вы можете использовать эту функцию для заполнения struct:

adfgx *res = malloc(sizeof(adfgx)); 
if (res == NULL) ... 
res->alphabet = duplicate(alphabet); 
... 
return res; 
+0

Любая конкретная причина предложить написать собственный вариант ['strdup()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/strdup.html) , не упоминая, что это то, предлагая? –

+0

@JonathanLeffler Это почти наверняка учебное упражнение, и написать собственную версию 'strdup', вероятно, является ее центральным элементом. Если бы профессор хотел, чтобы они использовали 'strdup', OP, вероятно, никогда не задавал бы этот вопрос :-) – dasblinkenlight

+1

Одна возможная интерпретация, да. Это не тот, который произошел со мной, но это далеко не невозможно. Другая возможная интерпретация заключается в том, что функция группирует свои аргументы в структуру для удобства; строки, на которые указывает, должны длиться до тех пор, пока код будет использовать структуру. Тогда все, что нужно, это скопировать указатели в выделенную структуру. В этом случае 'strdup()' вообще не требуется. Тем не менее, в среднем, более вероятно, что строки должны быть дублированы, но я не уверен, является ли 'strdup()' verboten. Я бы упомянул об этом - этих комментариев достаточно. –

1

Размер adfgx не зависит от «размера алфавита, символов, словаря и транспозиции» - это размер 4 указателя.

Как присвоить значения newAdfgx->alphabet и другим членам, вы можете использовать strdup. Просто убедитесь, что free() строки strdup ed, когда вы освободите экземпляр adfgx.

Смежные вопросы