Сверху донизу:
1.
Вы забыли #include stdlib.h
использовать calloc()
и malloc()
. Неявные объявления запрещены начиная с C99.
2.
int main(int argc, char* argv[])
Вашей программе не нужно вводить в нее аргументы.
Этот:
int main (void)
было бы более уместно.
3.
int size = 0;
size
никогда не должно иметь отрицательное значение. Так что было бы правильнее объявить его как unsigned int
или даже лучше size_t
.
4.
struct testMalloc* test = 0 ;
Вы можете использовать 0
для инициализации указателя. Это совершенно правильно, так как 0
является константой нулевого указателя. Но лучше использовать NULL
при работе с указателями, а не 0
, чтобы показать назначение указателя и улучшить читаемость.
struct testMalloc* test = NULL;
5.
calloc(sizeof(struct testMalloc));
calloc
требует два аргумента по сравнению с malloc
. Первое должно быть количеством элементов, а второе - размером одного элемента.
calloc(sizeof(1,struct testMalloc));
6.
test = (struct testMalloc*) calloc(sizeof(struct testMalloc));
Вам не нужно приводить возвращаемое значение malloc()
или calloc()
.
7.
Вы забыли проверить возвращаемый указатель из calloc()
на наличие нулевого указателя, если выделение не удалось. Всегда проверяйте возвращаемое значение функций управления памятью.
test = calloc(1, sizeof(struct testMalloc));
if (test == NULL)
{
fputs("Allocation failed!", stderr);
// error routine.
}
person
RobertS supports Monica Cellio
schedule
06.08.2020
(void*)0
в случае, если вы хотите получить указатель NULL в качестве значения. В противном случае это неопределенное поведение. - person alinsoar   schedule 06.08.20200
ISNULL
. На самом деле это неNULL
сейчас, но0
является константой нулевого указателя в соответствии со стандартом C. - person Andrew Henle   schedule 06.08.20200
при преобразовании в тип указателя всегда равен== NULL
. Он не обязательно должен быть представлен всеми битами 0. Не имеет значения, ставите ли вы явное приведение(void *)
или просто разрешаете его неявное преобразование. - person trentcl   schedule 06.08.2020NULL == 0
гарантированно оценивается как true. - person klutt   schedule 06.08.2020NULL
.NULL
не обязательно должно быть равно нулю, но числовое значение0
определено как константа нулевого указателя. И все нулевые указатели определены как равные. По сути, это взлом стандартов, позволяющий работать тому, что в противном случае было бы плохим кодом, который предполагает, чтоNULL
на самом деле0
. - person Andrew Henle   schedule 06.08.2020define NULL? (x) x<SOME/CONSTANT
? ВзятьSOME/CONSTANT
небольшое число, например 1024? В этом случае NULL можно интерпретировать как любое число, целочисленное значение которого будет небольшим... - person alinsoar   schedule 06.08.20200
. Преобразование целого числа в указатель не гарантирует отрисовки указателя с тем же битовым представлением, что и целое число. Если в конкретной архитектуреNULL
является значением указателя 0x8675309, то(void *)0
представлено в машине как 0x8675309. Но в вашем коде C это все еще нулевой указатель. - person trentcl   schedule 06.08.2020NULL
вместо0
не связана с внутренним представлением нулевых указателей. - person trentcl   schedule 06.08.2020