2014-02-02 2 views
1

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

Вот структура:

typedef struct 
{ 
    char **array; 
    int size, capacity; 
} ArrayList; 

А вот где я пытаюсь создать массив указателей и инициализировать их нуль:

ArrayList *createArrayList(int length) 
{ 
    int i; 
    ArrayList* strArray = malloc(sizeof(ArrayList)); 
    for(i=1; i<length; i++) 
    { 
    strArray->array[i] = NULL; 
    } 
return strArray; 
} 

К сожалению, это приводит к ошибке сегментации. Любая помощь будет принята с благодарностью.

+0

Начать с выделения памяти для элемента 'array'; а не только ваш локальный указатель на 'ArrayList'. – WhozCraig

ответ

3
strArray->array[i] = NULL; 

Вы не можете сделать это, как вы не выделили память для array. Вам нужно выделить его в качестве

strArray->array = malloc(sizeof(char *) * length); 

А затем инициализировать все элементы для NULL, как вы сделали.

Вы также можете использовать calloc, который устанавливает память на 0, и в этом случае вам не нужен цикл for.

strArray->array = calloc(length, sizeof(char *)); 
+0

Я согласен, что 'strArray-> array = calloc (length, sizeof (char *));' достаточно. Надежное решение будет использовать 'for (i = 0; i array [i] = NULL;' как 'NULL' не всегда 0 .. Это касается какого-то компьютера в забытом зале некоторых . – chux

+0

О, дерпп, не уверен, как я это пропустил. Большое спасибо! – user3262014

+0

@chux: константа нулевой указатель * (которая определена как макрос 'NULL') всегда 0-значная (6.3.2.3/3). –

0

Вы должны выделить память для своего массива указателей, а также для структуры. И вы должны начать цикл в 0, так как массивы C основаны на 0.

ArrayList *createArrayList(int length) 
{ 
    int i; 
    ArrayList* strArray = malloc(sizeof(ArrayList)); 
    strArray->array = malloc(length * sizeof(char *)); 
    for (i = 0; i < length; i++) 
    { 
     strArray->array[i] = NULL; 
    } 
    return strArray; 
} 
0

Они уже не имеют значения. Вы получаете ошибку seg, потому что вы не можете назначить переменную, которая еще не выделена. от линии

strArray-> массив [i] = NULL;

+0

Нет, они уже не NULL. – ooga

1

Прежде всего,

ArrayList* strArray = malloc(sizeof(ArrayList)); 

только выделяет пространство для самой strArray инстанции; он не выделяет ничего для вашего члена array. Вы должны выделить эту память отдельно:

strArray->array = calloc(length, sizeof *strArray->array); 

calloc обнулит инициализировать все элементы массива.

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