用户定义的类型,动态大小为C

我想定义一个新的数据类型,由一个由用户输入的大小的数组组成。 例如,如果用户输入128,那么我的程序应该创建一个新类型,它基本上是一个16字节的数组。 这个结构的定义需要是全局的,因为我将在我的程序中使用该类型。 这个结构必须有一个动态大小,因为我最终会有一个由这种类型的变量填充的HUGE数据库。

我现在的代码是:

struct user_defined_integer; . . . void def_type(int num_bits) { extern struct user_defined_integer { int val[num_bits/sizeof(int)]; }; return; } 

(这不起作用)

我发现,与我的问题最接近的是: 我需要在C中创建一个全局数组,其大小由用户输入 (这没有帮助)

有没有办法做到这一点,以便我的结构在整个文件中被识别?

做的时候:

 extern struct user_defined_integer { int val[num_bits/sizeof(int)]; }; 

你应该得到警告:

 warning: useless storage class specifier in empty declaration 

因为你有一个空的声明。 extern不适用于user_defined_integer ,而是适用于它之后的变量。 其次,这无论如何都不会起作用,因为包含可变长度数组的结构不能有任何链接。

 error: object with variably modified type must have no linkage 

即便如此,可变长度数组在声明点分配存储。 您应该选择动态内存。

 #include  typedef struct { int num_bits; int* val; } user_defined_integer; void set_val(user_defined_integer* udi, int num_bits) { udi->num_bits = num_bits; udi->val = malloc(num_bits/sizeof(int)); } 

您需要的是VLA会员,如此处所述 。 基本上,您声明一个带有size字段和一个元素的存储值作为最后一个成员的结构,并过度分配它。

从该问题导入:

 typedef struct Bitmapset { int nwords; uint32 words[1]; } Bitmapset; Bitmapset *allocate(int n) { Bitmapset *p = malloc(offsetof(Bitmapset, words) + n * sizeof *p->words); p->nwords = n; return p; } 

我想定义一个新的数据类型,由一个由用户输入的大小的数组组成。 例如,如果用户输入128,那么我的程序应该创建一个新类型,它基本上是一个16字节的数组。

这在C中是不可能的,因为C类型是编译时的东西,并且在运行时根本不存在。

但是,使用符合C99的编译器,您可以使用灵活的数组成员。 你需要一个包含一些成员的struct ,并以一个没有任何给定维度的数组结束,例如

 struct my_flex_st { unsigned size; int arr[]; // of size elements }; 

这是分配它的方法:

 struct my_flex_st *make_flex(unsigned siz) { struct my_flex_st* ptr = malloc(sizeof(struct my_flex_st) + siz * sizeof(int)); if (!ptr) { perror("malloc my_flex_st"); exit(EXIT_FAILURE); }; ptr->size = siz; memset (ptr->arr, 0, siz*sizeof(int)); return ptr; } 

一旦你不再使用它,不要忘记free它。

当然,您需要在代码中使用指针 。 如果你真的想拥有一个全局变量,请将其声明为例如

 extern struct my_flex_st* my_glob_ptr; 

试试这种方法 –

 #include #include #include struct user_defined_integer { int *val; }user_int; void memory_allocate(int num_bit) { int result; result = (num_bit+CHAR_BIT-1)/CHAR_BIT; // since 8 bit =1 byte user_int.val=malloc(result*sizeof(int)); if(user_int.val == NULL){ printf("Failed to allocate memory\n"); return ; } else printf("Allocated %d bytes for val\n",result); } int main() { int num_bit; printf("Enter the number of bits\n"); scanf("%d",&num_bit); memory_allocate(num_bit); // do your stuff here free(user_int.val); // free the memory at the end; return 0; }