Как уже говорили другие, во фрагменте, который вы показали, есть две явно неправильные вещи:
- Вы не выделяете память для
filename
и size
членов только что выделенных структур,
- Ваш
memset()
звонок использует неправильный размер.
Ваш memset()
вызов может быть упрощен и исправлен с помощью:
memset(primary, 0, primarypcs * sizeof *primary);
Есть еще одна тонкая проблема с вашим кодом: стандарт C не гарантирует, что все биты-ноль являются константой нулевого указателя (т. Е. NULL), поэтому memset () не является правильным способом установки указателя на NULL
. Портативный способ сделать то, что вы хотите сделать, это:
size_t i;
for (i=0; i < primarypcs; ++i) {
primary[i].filename = NULL;
primary[i].size = NULL;
}
Чтобы выделить память для filename
и size
, это зависит от того, что вы хотите. Допустим, вы определили, что filename
нужно n
байтов, а size
нужно m
. Затем ваш цикл меняется на что-то вроде этого:
size_t i;
for (i=0; i < primarypcs; ++i) {
size_t n, m;
/* get the values of n and m */
primary[i].filename = malloc(n * sizeof *primary[i].filename);
primary[i].size = malloc(m * sizeof *primary[i].size);
}
Вы можете опустить умножение на sizeof *primary[i].filename
и sizeof *primary[i].size
из приведенного выше, если хотите: C гарантирует, что sizeof(char)
равно 1. Я написал выше для полноты и для случая, когда filename
и size
изменить типы.
Также обратите внимание, что если filename
- строка длиной k
, то вам нужно (k+1)
байт для нее из-за окончания 0
(поэтому n == k+1
выше).
Если бы я угадал, вы хотите, чтобы size
сохранил длину соответствующего filename
? Если это так, size
должен быть не char *
, а size_t
. Но так как я не знаю, как вы планируете использовать filename
и size
, я не уверен.
Обязательно проверьте возвращаемое значение malloc()
. Возвращает NULL
для сбоя. Я упустил проверку из приведенного выше кода для простоты.
Ваше сообщение было также помечено как C ++, поэтому, если вы хотите использовать C ++, также доступно решение C ++.