结构包装器和可变数组大小

时间:2019-01-07 22:42:21

标签: c

我经常使用:

  1. 数组包装器按值传递数组,但问题是数组的大小是在编译时确定的(请参见代码的第一部分)
  2. 依赖于变量的数组声明(参见代码的第二部分)

如何“组合”这两种类型的代码以具有依赖于变量的数组包装器? (请参阅代码的第三部分。我知道它无法工作,因为结构声明中有一个变量,只是在这里提供一个想法)

#include <stdio.h>

int main() {
// First part of code
// Array wrapper to pass array by value but size of array is determined at compile time
struct S {int m_array[5];} myarray={1,2,3,4,5};
struct S myarraycopy;
struct S copyarray(struct S a) { return a ;}
myarraycopy=copyarray(myarray);
for (int i=0;i<5;i++) printf("%d \n",myarraycopy.m_array[i]);

// Second part of code
// Array declaration is function of a variable n and
// so it is not determined at compile time
int n;
printf("Size : ");scanf("%d",&n);
int myarray1[n];
for (int i=0;i<n;i++) myarray1[i]=i;
printf("Array size %d \n",sizeof(myarray1));
for (int i=0;i<n;i++) printf("%d \n",myarray1[i]);

/* How to combine the two parts above ???
int n1;
printf("Size : ");scanf("%d",&n1);
struct S1 {int m_array[n1];} myarray1;
struct S1 myarraycopy1;
struct S1 copyarray1(struct S1 a) { return a ;}
myarraycopy1=copyarray1(myarray1);*/

}

2 个答案:

答案 0 :(得分:0)

  

如何“组合”这两种类型的代码以具有依赖于变量的数组包装器?

至少在标准C中,您不能。以标准的术语来说,结构类型的成员不能进行可变修改。这样做的目的是,结构类型的大小始终是编译时常量(即使从技术上讲,甚至具有灵活的数组成员的结构类型也是如此)。

通常情况下,您可以选择以指向其第一个元素的指针的形式正常传递数组。您可以将函数参数声明为指向const元素的指针,以便函数无法修改数组(至少在不放弃const ness的情况下,可以肯定地说服编译器发出警告关于)。

这不符合您的copyarray()用例,因为您既不能返回数组(这样),也不能分配给整个数组。但是memcpy()可以很好地完成这项工作,而无需按值包装或传递数组,因此这种情况似乎是人为的。

答案 1 :(得分:-1)

我尝试使用灵活的数组成员(请参见下面的代码)。对此代码不起作用,我并不感到惊讶。实际上,在编译时不知道柔性数组的大小(参见标准6.7.2.1 * s1 = * s2;)。

但是,由于myarray1的大小是已知的(sizeof(S1)+n1*sizeof(int),所以我想知道代码中的内联汇编语言是否可以用于强制复制整个变量myarray1。

#include <stdio.h>

typedef struct {int l;int m_array[];}S1;
void myfoo(S1 a) {
    for (int i=0;i<a.l;i++) a.m_array[i]*=10;
    printf("in myfoo\n");
    for (int i=0;i<a.l;i++) printf("%d \n",a.m_array[i]);
}

int main() {

int n1;
printf("Size : ");scanf("%d",&n1);
S1 *myarray1=malloc(sizeof(S1)+n1*sizeof(int));

myarray1->l=n1;
for (int i=0;i<n1;i++) myarray1->m_array[i]=i;

myfoo(*myarray1);
printf("in main\n");
for (int i=0;i<n1;i++) printf("%d \n",myarray1->m_array[i]);
}