memcpy和指针
我对如何使用memcpy读取数组中复制的指针感到困惑。 以下是我尝试过的,但不起作用 基本上,我已经分配了一个内存块,在这个内存块中复制指针的方式类似于数组方式,但在重试过程中它不起作用。而这可以正确地处理基本数据类型 我想在memcpy和指针,c,memcpy,C,Memcpy,我对如何使用memcpy读取数组中复制的指针感到困惑。 以下是我尝试过的,但不起作用 基本上,我已经分配了一个内存块,在这个内存块中复制指针的方式类似于数组方式,但在重试过程中它不起作用。而这可以正确地处理基本数据类型 我想在元素块中存储任何内容,它可以是整数或指针 #include <stdio.h> #include <stdlib.h> #include <string.h> #define INDEX(x) ((char *)elements +
元素
块中存储任何内容,它可以是整数
或指针
#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;
}
#包括
#包括
#包括
#定义索引(x)((char*)元素+(sizeof(int*)*(x)))
int size=10;
void f2_int_ptr(){
int i=0;
void*elements=(void*)malloc(size*sizeof(int*);
对于(i=0;i
在上面的代码中,
f1_int
工作正常,但是f2_int_ptr
不工作。代码非常难看,所以我甚至不知道它应该如何工作,但是:
为什么在这里使用&v:
memcpy ( &v, INDEX(i), sizeof ( int ));
v是指针本身:
int *v = (int*)0;
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 );
}
}
void f2_int_ptr(){
int i=0;
void*elements=malloc(size*sizeof(int*);
对于(i=0;i
请注意memcpy()
参数的细微变化
注意:我真的,真的,真的,不会写这样的代码!很难理解。如果要将指针存储在元素中,我认为最终的memcpy需要使用&v将元素复制到指针v。类似于v=元素[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 );
}
}
void f2_int_ptr(){
int i=0;
void*elements=(void*)malloc(size*sizeof(int*);
对于(i=0;i
谢谢大家,终于成功了。
我想我还没有分配复制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 );
}
}
void f2_int_ptr(){
int i=0;
void*elements=(void*)malloc(size*sizeof(int*);
对于(i=0;i
注意:所有这些从void*
(以及宏)到void*(以及宏)的类型转换都不会让代码变得非常糟糕。您是否有任何理由到处使用void*
?这适用于所有基本类型,但不仅仅适用于指针。如果您希望代码被读取,您应该尝试澄清代码。C是一个恶作剧()并不是一个这样编码的参数,它会在没有这个参数的情况下转储。我想从数组中读取,但不知道如何读取,数组中复制了指针。如果我使用指针到指针,那么我必须确保始终分配进入块的元素,我不能从堆栈中读取元素。@Oli Charlesworth,我同意这不是好代码,但在您的解决方案中,这意味着我必须使用不同的方法来复制和检索基本类型和指针类型。@Avinash:基本类型和指针类型是根本不同的。现在还不清楚你为什么希望能对他们一视同仁。你想在这里实现什么?我想用C写一个stl向量,如果客户端在堆上分配内存并作为元素传递给我,我就可以做到。但我希望它能与基本数据类型一起工作,并且不应该有特殊的方法在堆栈或堆变量上传递变量。有一种方法可以使用宏来实现这一点,但我正在寻找避免宏的选项。Ok。通过编辑,我想我看到了您正在尝试做的事情,(将指针复制到元素中。)因此我已更新。这也将转储,我想我需要在获取元素之前分配v。我不会认为您需要这样做,因为您已经有了原始的alloc。因为您存在内存泄漏。您没有在第一个或第二个循环中释放v
。另外,您将int
值存储在元素中,而不是int*
。看看我的答案。