void *answer;
...
int * answer_beeing_an_int_arr = answer;
printf(" %d", answer_beeing_an_int_arr[j]);
Это то, что вы хотите.Но вы обнаружите, что:
printf(" %d", (int)answer[j]);
не работает.Почему ты спрашиваешь?Это потому, что приведение (int)
имеет более низкий приоритет, чем индекс массива [j]
, а также вы не говорите компилятору, что answer
является указателем на int
с, только что он должен сначала получить значение, чем приведен к инт.Вы хотите это:
printf(" %d", ((int*)answer)[j]);
Вы хотите сказать компилятору, что ответом является указатель на int.Затем вы хотите добавить к этому указателю sizeof(int) * j
байтов и разыменовать его.
И не забудьте free(answer)
.
Теперь к вашему коду:
buffer = a;
неверно.Он назначает указатель на другой указатель.Вы хотите скопировать значения за указателями, а не сами указатели.Вам нужно:
memcpy(buffer, a, sizeof(int) * i);
или
for (size_t j = 0; j < i; ++j) {
buffer[j] = a[j];
}
для копирования значений массива.
... = malloc(i);
Это выделит i
байтов.И вы можете заметить, что int
не имеет 1 байта (биты CHAR_BIT, вероятно, 8).Это имеет больше.Это может быть 2, может быть больше.sizeof(int)
скажет вам, сколько байтов имеет int
.Так должно быть:
int *buffer = malloc(i * sizeof(int));
или как мне нравится:
int *buffer = malloc(i * sizeof(*buffer));
Также:
int* buffer = (int*) malloc(i);
...
return (void *) buffer;
Нет необходимости приводить указатель к void*
и с void*
.void*
- это общий указатель, это указатель на ничто.Всего:
int* buffer = malloc(i * sizeof(*buffer));
...
return buffer;