Недавно я решил освежить свои знания C (то немногое, что у меня осталось). Я довольно быстро понял, что первым навыком, который стал туманным, было управление памятью. Проклятый.
Я решил, что лучше всего будет написать несколько бессмысленных упражнений с указателем. Первый заключался в выделении массива из 4 массивов символов, каждый из которых имел переменную длину.
Упрощенная версия этого кода:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char **aStr = malloc(4*sizeof(aStr));
int j = 0;
int i = 0;
while(i<sizeof(aStr))
{
j = 4 + 2*i;//in my code, length is determined by arguments
aStr[i] = malloc(j*sizeof(aStr[i]));
j--;
strncpy(aStr[i],"RaisinRubarbCarrot"+i,j);
aStr[i][j] = 0;//just a habbit
j++;
printf("ptr@:%p\n\tkey:%d\n\tval:%s\n\tlength:%d (%d)\n\n",*aStr[i],i,aStr[i],j,strlen(aStr[i]));
i++;
}
free(aStr);
return 0;
}
Я чувствовал, что это было неуклюжим и нелогичным. Сегодня я вспомнил своего старого врага: calloc
. потом я написал
char **aStr = (char **)calloc(4, sizeof(char *));
и в цикле:
aStr[i] = (char *) calloc(j,sizeof(char *));
Я нашел примеры кода, которые записывают последнюю строку так:
aStr[i] = (char *) calloc(j,sizeof(char));//without the asterisk
Вопрос 1: в чем разница, если есть?
Вопрос 2: Нет ли другого способа размещения массива строк? то, как я вижу код сейчас, кажется/выглядит так, будто я сначала выделяю 4 указателя на один указатель char, а затем выделяю фактический размер, необходимый для каждого указателя. Это просто кажется неправильным.
С другой стороны, я могу ошибаться во всем этом, и в этом случае: не стесняйтесь биться головой о стену и указать мне направление приличного руководства, которое я должен прочитать, прежде чем тратить все ваше время...
aStr[i] = (char *) calloc(j,sizeof(char));
неsizeof(char *)
- person Gir   schedule 14.08.2012sizeof(char)
равно 1 по определению, и вам не следует разыгрывать. Так что это должно быть толькоaStr[i] = calloc(j, 1);
. - person Kerrek SB   schedule 14.08.2012