我希望能够使用全局指针引用变量大小的数组。但是我使用哪种指针可以使用可变大小的数组?在下面的示例中,假设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)
答案 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)
缩减为单一的全球,我会很高兴看到它:)