На самом деле я изучаю программирование на C, и моя школа фактически не позволяет нам использовать calloc/realloc без их перепрограммирования. Вот почему я прошу о помощи.
Вот моя проблема: я хочу использовать void *
, чтобы мой код можно было использовать повторно, но я сталкиваюсь с проблемой «разыменования указателя void *
», когда пытаюсь запустить свой массив. Я не могу подобрать тип конечного указателя.
Вот мои функции:
#include <stdlib.h>
void *my_calloc(size_t size, size_t n) //n = number of bytes your type : sizeof(<whatever>)
{
void *ptr = NULL;
if (size < 1 || n < 1)
return (NULL);
ptr = malloc(n * (size + 1));
if (ptr == NULL)
return (NULL);
for (int i = 0; i != (n * (size + 1)); i++) {
*ptr = NULL; //Here is my problem
ptr++;
}
return (ptr);
}
void *my_realloc(void *src, size_t size, size_t n)
{
void *dst = NULL;
int dst_len = 0;
if (src == NULL || size < 0 || n < 1)
return (NULL);
dst_len = my_strlen(src) + size;
if (dst_len == my_strlen(src))
return (src);
dst = my_calloc(dst_len, n);
if (dst == NULL)
return (NULL);
for (int i = 0; src[i] != NULL;i++)
dst[i] = src[i]; //Here is the same problem...
free(src);
return (dst);
}
Я просто обнаружил проблему, когда писал свой пост, моя функция my_strlen
может принимать только char *... поэтому мне нужна функция my_strlen
, выглядящая так:
int my_strlen(void *str)
{
int len = 0;
while (str[len] != NULL) { //same problem again...
len++;
}
return (len);
}
Типичная функция, в которой я вызываю calloc / malloc, будет:
int main(void)
{
char *foo = NULL;
int size = 0;
int size_to_add = 0;
size = <any size>;
//free(foo); //only if foo has been malloc before
foo = my_calloc(size, typeof(*foo));
//something
size_to_add = <any size>;
foo = my_realloc(foo, size_to_add, sizeof(*foo))
//something
free(foo);
return (0);
}
Спасибо за попытку помочь мне.
ptr
? - person bruceg   schedule 11.01.2019ptr
используйте, например.char *src = ptr;
(и, возможно,char *dst;
вместоvoid *new;
для источника и назначения соответственно). - person Nominal Animal   schedule 11.01.2019ptr++;
? Вы не можете сделать это сvoid *
, так как нет типа и, следовательно, нет следующего адреса для увеличения. - person Andrew Henle   schedule 11.01.2019my_realloc()
, что вы пытаетесь сделать сnew_len = my_strlen(ptr) + size;
? Вы не можете найти размер, выделенный для старого блока с помощью функции типаstrlen()
, аrealloc()
не добавляет новый размер к старому размеру, а просто изменяет размер блока до нового размера (или выделяет новый, если это необходимо). - person Dmitri   schedule 11.01.2019calloc()
, а затем вызоветеstrlen()
по указателю, какой размер он сообщит, учитывая, что вся память обнулена? Это блок размером 1000 байт, но сообщит ли об этомstrlen()
? - person Dmitri   schedule 11.01.2019src
иdst
типаchar *
внутри своих функций.size
всегда в символах, потому чтоsizeof (char) == 1
в C. Ваши функции по-прежнему принимают и возвращаютvoid *
. - person Nominal Animal   schedule 11.01.2019+ 1
вptr = malloc(n * (size + 1));
? - person chux - Reinstate Monica   schedule 11.01.2019my_calloc()
выделял больше памяти, чемcalloc()
? - person chux - Reinstate Monica   schedule 11.01.2019calloc()
, когда этот код заменяется наmy_calloc()
, он просто будет менее эффективным. Хммм, я думаю ваша цель была бы ок, если бы вы назвали ее неmy_calloc()
, а, может быть,my_string_calloc()
, чтобы уточнить, что ваша***_calloc()
отличается по функционалу от стандартнойcalloc()
. - person chux - Reinstate Monica   schedule 11.01.2019