Memcpy и указатели
Я путаюсь, как читать указатели, скопированные в массив с помощью memcpy.
Вот что я пробовал, но не работает.
В принципе, я выделил блок памяти, в котором я копирую указатели, похожие на массив, но во время повторного запуска он не работает. Хотя это работает с основными типами данных правильно
Я хочу сохранить что-либо в блоке element
, может быть либо integers
, либо pointers
.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define INDEX(x) ((char *)elements + (sizeof(int*) * (x)))
int size = 10;
void f2_int_ptr() {
int i = 0;
void *elements = (void*)malloc(size * sizeof(int*));
for ( i = 0; i < size; i++ ) {
int *v = ( int *) malloc ( sizeof(int));
memcpy ( v, &i, sizeof ( int ));
memcpy ( INDEX(i) , v, sizeof (int*));
}
for ( i = 0; i < size; i++ ) {
int *v = (int*)0;
memcpy ( v, INDEX(i), sizeof(int *));
printf ( "%d\n", *v );
}
}
void f1_int() {
int i = 0;
void *elements = (void*)malloc(size * sizeof(int));
for ( i = 0; i < size; i++ ) {
memcpy ( INDEX(i) , &i, sizeof (int));
}
for ( i = 0; i < size; i++ ) {
int v;
memcpy ( &v, INDEX(i), sizeof ( int ));
printf ( "%d\n", v );
}
}
int main(){
f1_int();
f2_int_ptr();
return 0;
}
В приведенном выше коде f1_int
работает нормально, но f2_int_ptr
не работает.
Ответы
Ответ 1
f2_int_ptr()
должно стать следующим:
void f2_int_ptr() {
int i = 0;
void *elements = malloc(size * sizeof(int*));
for ( i = 0; i < size; i++ ) {
int *v = malloc ( sizeof(int));
memcpy ( v, &i, sizeof ( int ));
memcpy ( INDEX(i) , &v, sizeof (int*));
}
for ( i = 0; i < size; i++ ) {
int *v;
memcpy ( &v, INDEX(i), sizeof(int *));
printf ( "%d\n", *v );
}
}
Обратите внимание на тонкие изменения аргументов memcpy()
.
Примечание: Я действительно, действительно, действительно, не писал бы такой код! Это невероятно сложно.
Ответ 2
Код очень уродлив, поэтому я даже не знаю, как это должно работать, но:
Почему вы используете & v здесь:
memcpy ( &v, INDEX(i), sizeof ( int ));
v - сам указатель:
int *v = (int*)0;
Ответ 3
Если вы сохраняете указатели в элементах, я думаю, что окончательная memcpy должна использовать & v для копирования элемента в указатель v. Аналогично v = elements [i].
void f2_int_ptr() {
int i = 0;
void *elements = (void*)malloc(size * sizeof(int*));
for ( i = 0; i < size; i++ ) {
int *v = ( int *) malloc ( sizeof(int));
memcpy ( v, &i, sizeof ( int *));
memcpy ( INDEX(i) , &v, sizeof (int*));
}
for ( i = 0; i < size; i++ ) {
int *v = (int *)0;
memcpy ( &v, INDEX(i), sizeof(int *));
printf ( "%d\n", *v );
}
}
Ответ 4
спасибо Ребята, он работал наконец.
Я предполагаю, что я не выделил место для копирования memcpy.
void f2_int_ptr() {
int i = 0;
void *elements = (void*)malloc(size * sizeof(int*));
for ( i = 0; i < size; i++ ) {
int *v = ( int *) malloc ( sizeof(int));
memcpy ( v, &i, sizeof ( int ));
memcpy ( INDEX(i) , v, sizeof (int*));
}
for ( i = 0; i < size; i++ ) {
int *v = ( int *) malloc (sizeof(int*));
memcpy ( v, INDEX(i), sizeof(int*));
printf ( "%d\n", *v );
}
}