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语言指针数组的主要内容,如果未能解决你的问题,请参考以下文章