如何指针引用动态大小的指针到数组?

时间:2014-08-03 07:22:36

标签: c arrays pointers

我希望能够使用全局指针引用变量大小的数组。但是我使用哪种指针可以使用可变大小的数组?在下面的示例中,假设N仅在运行时已知(例如可能是参数),因此编译时解决方案将不起作用。

我想要实现的目标:

main.c

some_sort_of_pointer *x;

main()
{
    int N=256; //or N=64 or whatever
    char (*LC)[N];

    LC=malloc(1024);
    x=LC;
    memcpy(x[2],"hello world",11);
    x[0][176]=123;

    dostuff();
}

我确信有一个很简单的方法可以做到这一点,但我似乎无法确定它。我第一次尝试这个问题是一团糟,所以这次我希望我能清楚地知道我想要实现的目标。

OS Centos 6.5

编译器GCC 4.8(使用C99)

2 个答案:

答案 0 :(得分:2)

在编译时,没有给出要引用的类型,void指针可能有帮助。

然而,仅存储无类型引用(实际上void *是什么)是不够的,因为知道(VL)数组的大小也是必要的。所以后者也需要全局存储,因为它不能从引用的内存中拉出来。

如何实现这一目标的一个例子如下:

main.h:

#include <stdlib.h> /* for size_t */

struct VLA_descriptor
{
  void * p;
  size_t s;
} 

extern struct VLA_descriptor vla_descriptor;

foo.h中:

void foo(void);

foo.c的:

#include "main.h"
#include "foo.h

void foo(void)
{
  char (*p)[vla_descriptor.s] = vla_descriptor.p;

  /* Do something with the VLA reference p. */
}

main.c中:

#include "main.h"
#include "foo.h"

struct VLA_descriptor vla_descriptor = {0};

int main(int argc, char ** argv)
{
  size_t s = atoi(argv[1]);
  char (*p)[s] = malloc(s);

  vla_descriptor.p = p;
  vla_descriptor.s = s;

  foo();

  ... /* Free stuff and return. */
}

为了便于阅读,在此示例的代码中省略了错误检查。

答案 1 :(得分:0)

非常感谢@alk(以及其他所有回复的人),我想我最接近我要找到的东西:

void *LC
int LCS;
int main(int argc, char **argv) {
    LCS=256;
    LC=malloc(1024)
    memcpy(((char(*)[LCS])LC)[2],"hello world",11);
    ((char(*)[LCS])LC)[0][176]=123;
    printf("%d %s\n",((char(*)[LCS])LC)[0][176],&((char(*)[LCS])LC)[2]);
}

((char(*)[LCS])LC)相当于我想要的东西。它与@ alk的想法类似,并且需要2个全局变量,但这意味着我可以在函数中使用它而无需声明新的变量。我把@答案归功于@alk,因为他发布的内容给了我90%的所需。

虽然如果有人可以将((char(*)[LCS])LC)缩减为单一的全球,我会很高兴看到它:)