gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:10:53 24 4
gpt4 key购买 nike

我经常使用:

  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);*/

}

最佳答案

How is it possible to "combine" these two types of code to have array wrappers that depends of a variable ?

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

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

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

关于c - 结构包装器和可变数组大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54082905/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com