calloc(x,y)
эквивалентно malloc(x*y)
Но calloc
делает дополнительные (устанавливая значения на 0 с помощью) memset(block, 0, x*y)
Эта функция предназначена только для приятного прохождения размер элемента и количество элементов , когда в malloc необходимо умножить эти значения, чтобы получить необходимое количество байтов, эта функция также проверяет целочисленное переполнение при умножении.
Например, если вы хотите выделить память для 12 целых чисел и хотите сделать что-то с этими целыми числами, и вы, должно быть, установили ее значения на 0, используйте calloc(12, sizeof(int))
Но если вы хотите выделить некоторый блок памяти ( 256 байт), чтобы в будущем скопировать в него некоторую строку, тогда memset
для вас непригодна, тогда лучше использовать malloc(sizeof(char) * 256)
или, например, malloc(sizeof(wchar_t) * 256)
void *
calloc (size_t nmemb, size_t lsize)
{
void *ptr;
struct __meminfo *info;
size_t size = lsize * nmemb;
/* if size overflow occurs, then set errno to ENOMEM and return NULL */
if (nmemb && lsize != (size / nmemb))
{
set_errno (ENOMEM);
return NULL;
}
/* allocate memory */
ptr = malloc (size);
/* get pointer to info part of chunk */
info = __mem2info (ptr);
/* fill memory with zeros and set __MEM_CALLOC flag */
memset (ptr, 0, info->size);
info->flags |= __MEM_CALLOC;
return ptr; /* happy end */
}
Вам необходимо изменить виджет для базового поля
, а не для типа поля. Думаю, это сработает:
class OpBaseForm(ModelForm):
base = forms.ModelChoiceField(queryset=Base.objects.all(),
widget=forms.TextInput)
class Meta:
model = OpBase
... etc...