C:内存地址数组?

xcdev

我正在尝试为多个不同的结构制作一种容器。不幸的是,C 只允许类型特定的数组,这意味着我必须为每种类型的结构创建一个不同的数组。

我提出的当前解决方案是一个保存内存地址的容器。这样,程序就可以将其中一个元素的内存地址传递给函数。

目前我唯一的代码是使用 void 指针的失败尝试(不幸的是,我对指针和内存地址并不是很熟悉)

以下是我编写的测试代码,试图了解这些东西是如何工作的:

void* arr[10]={};
int len=0;

int n[5]={1,2,3,4,5};
for (int i=0;i<5;i++) { //add pointers nums in n to arr
  arr[i]=(void*)(&n[i]);
  len++;
}

for (int i=0;i<len;i++) { //print contents of arr
  printf("%p\n", (void*)arr[i]);
  printf("\t%d\n", arr[i]); //trying to print actual value (eg. 2 for index 2) but not really sure how to...
}

谢谢!

4386427

您的方法是正确的,但缺少一些东西......

在 C 中,任何对象指针都可以转换为空指针并返回原始类型的指针。因此,可以将整型指针转换为空指针并返回整型指针。并且可以将浮点指针转换为空指针并返回浮点指针。

因此,使用空指针数组来存储指向不同对象类型的指针是一种很好的方法。

但是...为了将空指针转换回原始类型,您需要知道原始类型是什么。如果您只是保存空指针,则没有该信息。

而是考虑以下内容:

struct gp
{
    void* p;
    unsigned type_tag;
}

#define INT_TYPE 0
#define FLOAT_TYPE 1

并使用它:

struct gp arr[2];
int n = 42;
float f = 42.42;

arr[0].p = &n;
arr[0].type_tag = INT_TYPE;

arr[1].p = &f;
arr[1].type_tag = FLOAT_TYPE;

for (int i=0; i < 2; ++i)
{
    if (arr[i].type_tag == INT_TYPE)
    {
        int* p = (int*)arr[i].p;  // Cast void-pointer back to int-pointer
        printf("%d\n", *p);       // Get int-value using *p, i.e. dereference the pointer
    }
    else if (arr[i].type_tag == FLOAT_TYPE)
    {
        int* p = (float*)arr[i].p;  // Cast void-pointer back to float-pointer
        printf("%f\n", *p);         // Get float-value using *p, i.e. dereference the pointer
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章