【问题标题】:passing structs into function by reference in C code (compilation error)在 C 代码中通过引用将结构传递给函数(编译错误)
【发布时间】:2014-04-30 19:19:57
【问题描述】:

这有什么问题吗? 根据编译器,这一行有错误

void memory_allocation(struct a *s1,struct b *s2,struct c *s3,int size) 

主要看起来像

main()
{   
    struct mystack
    {
        int head;
        void **stack;
        void **stackcopy;
        int stack_size;

    } *ptr ; 

    struct professor
    {
        char flag;
        char surname[50];
        char coursbhe[50];
    } *prof;

    struct student
    {
        char flag;
        char surname[50];
        int semester;
    } *stud;

    (*ptr).stack_size=getstacksize();
        memory_allocation(&ptr,&prof,&stud,(*ptr).stack_size);

}

【问题讨论】:

  • 结构体 a、b 和 c 是如何定义的?
  • void memory_allocation(struct a *s1,struct b *s2,struct c *s3,int size) :不同的类型。和ptr 未初始化。
  • 为什么要将指针地址传递给函数memory_allocation?尝试不带 & 符号传递它
  • 因为如果我使用 malloc 在函数中分配内存而不传递指针的地址,则不会为 main 中的结构分配内存,所以我必须使用双指针。这就是我知道的它有效,不是吗?
  • 您的类型对于定义它们的函数 (main()) 是本地的。这意味着您不能可靠地将这些类型的变量传递给任何其他函数。您应该在 main 之外定义类型,以便其他函数可以使用相同的类型。有一个类型等价的概念,但也有一个叫做 DRY 的概念——不要重复你自己。另一个函数可以使用这些类型的唯一方法是再次写出它们,重复你自己。不要!

标签: c struct pass-by-reference


【解决方案1】:

您的类型对于定义它们的函数 (main()) 是本地的。这意味着您不能可靠地将这些类型的变量传递给任何其他函数。您应该在main() 之外定义类型,以便其他函数可以使用相同的类型。有一个类型等价的概念,但也有一个叫做 DRY 的概念——不要重复你自己。另一个函数可以使用这些类型的唯一方法是再次将它们写出来,重复你自己。别!

您的类型需要在函数之外可用。定义类型时不必定义任何全局变量。例如,您可以使用:

struct mystack
{
    int head;
    void **stack;
    void **stackcopy;
    int stack_size;
};

struct professor
{
    char flag;
    char surname[50];
    char coursbhe[50];
};

struct student
{
    char flag;
    char surname[50];
    int semester;
};

extern int getstacksize(void);
extern void memory_allocation(struct stack **s1, struct professor **s2,
                              struct student **s3, int size);
extern void memory_release(struct stack *stack, struct professor *prof,
                           struct student *stud);

int main(void)
{   
    struct mystack *ptr = 0; 
    struct professor *prof = 0;
    struct student *stud = 0;
    int stack_size = getstacksize();
    memory_allocation(&ptr, &prof, &stud, stack_size);
    memory_release(ptr, prof, stud);
    return 0;
}

请注意,内存分配函数不能做任何有用的事情,除非:

  1. 它知道要分配的结构的类型。
  2. 将指针传递给指针,因此它可以修改main() 中的实际指针。
  3. 内存释放函数不需要指针语法,尽管它可以被使用,如果它被使用,内存释放函数应该在释放内存时将指向的指针设置为 NULL 以最小化滥用的风险已释放内存。

需要附加变量stack_size,因为在调用getstacksize()ptr 不指向任何内容,因此引用(*ptr).stack_size 可能会崩溃并且肯定无法正常工作。或者,您可以将变量的定义更改为stack mystack stack;,然后使用stack.stack_size = getstacksize(); 并将stack.stack_size 传递给分配函数,但是您不再需要内存分配器来分配整个堆栈。职责分离表明将有一个单独的函数来分配堆栈内部。

从第一行struct mystack 到但不包括int main(void) 的所有材料都可以放入标题中,以便函数的实现可以看到与main() 程序相同的类型和函数定义可以看到。

【讨论】:

    【解决方案2】:

    这是解决方案.... 使用您的函数原型如下

    void memory_allocation(struct mystack *s1 , struct Professor *s2 , struct student *s3 , int d)

    因为您使用已定义的结构而不是其他结构进行调用,所以调用应该是这样的

    memory_allocation(ptr,prof,stud,(*ptr).stack_size);

    去掉“&”号或者去掉*s1到s1(必须传递地址,而不是地址的地址)

    请改变这两个东西,它会工作,我这边工作..

    【讨论】:

      猜你喜欢
      • 2018-09-22
      • 2018-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多