Struct中的C语言指针数组

Posted

技术标签:

【中文标题】Struct中的C语言指针数组【英文标题】:C language pointer array in Struct 【发布时间】:2021-09-22 18:57:57 【问题描述】:

代码:

#include <stdio.h>
#include <stdlib.h>

typedef struct
    int *arr;
example;

void Create(example var)
    var.arr = (int *)malloc(sizeof(int)*2);


int main()
    example var1, var2;
    var1.arr = (int *)malloc(sizeof(int)*2);
    var1.arr[0] = 11;
    var1.arr[1] = 22;
    printf("%d %d\n",var1.arr[0],var1.arr[1]);
    Create(var2);
    var2.arr[0] = 111;
    var2.arr[1] = 222;
    printf("%d %d\n",var2.arr[0],var2.arr[1]);
    return 0;

OUT:
11 22
Segmentation Fault

我的代码如上。当我像在 var1 中那样手动操作时,我没有收到任何错误。但是,如果我在 var2 中的函数内执行此操作,则会出现错误。我怎样才能解决这个问题。我想在函数内部做。

编辑:感谢您的回答。成功了

【问题讨论】:

Create 的参数是按值传递的。调用Create(var2) 不会以任何方式修改var2,传递的是一个副本。您可能希望Create 将指针作为参数,或者返回一个新的example 【参考方案1】:

函数参数

void Create(example var)
    var.arr = (int *)malloc(sizeof(int)*2);

是它的局部变量,由传入的参数初始化,退出函数后不存在。

就是这个电话

Create(var2);

没有改变 main 中声明的变量 var2。

作为这些陈述的结果

var2.arr[0] = 111;
var2.arr[1] = 222;

使用了未初始化的指针arr,它具有一个不确定的值,会调用未定义的行为。

您需要通过引用函数来传递变量。例如

void Create(example *var)
    var->arr = (int *)malloc(sizeof(int)*2);

函数的调用方式如下

Create( &var2 );

【讨论】:

【参考方案2】:

问题是 Create() 正在制作您的结构的 COPY。原来的结构没有改变。

如果您的程序是 C++,您需要传递 "reference"。

这里,你要传递一个指针:

void Create(example * mystruct)
    mystruct->arr = (int *)malloc(sizeof(int)*2);


int main()
    example var1, var2;
    ...
    Create(&var2);

【讨论】:

【参考方案3】:

你必须传递 var2 的引用: 创建(&var2);

【讨论】:

以上是关于Struct中的C语言指针数组的主要内容,如果未能解决你的问题,请参考以下文章

c语言中的指针类型属于原子类型还是结构类型?

c语言赋值是啥?

c语言中函数返回值可以是数组、字符串和结构体吗?

C语言结构体中成员若是一个指针时的疑惑??

C语言中的二维数组名是一个二重指针吗?

C语言结构体指针定义问题 - C / C++ -