C 如何使用指针参数调用void函数?

C 如何使用指针参数调用void函数?,c,C,我不明白如何在main中正确调用此函数。 我试着这样调用:X*p1=malloc(sizeof(X));读取(&p1) 问题中声明的函数(void read(X*p))需要一个指向X的指针作为参数。 您的(X*p1)声明确保它是指向X的指针。 您的初始化(p1=malloc(sizeof(X));)使其成为指向适当大小的可用内存块的指针 就这样 但是,您可以将适当的指针与“take the address operator”&一起使用,这将导致指向X的指针 用p1作为参数调用函数 read(p1

我不明白如何在main中正确调用此函数。
我试着这样调用:
X*p1=malloc(sizeof(X));读取(&p1)


问题中声明的函数(
void read(X*p)
)需要一个指向X的指针作为参数。
您的(
X*p1
)声明确保它是指向X的指针。
您的初始化(
p1=malloc(sizeof(X));
)使其成为指向适当大小的可用内存块的指针

就这样

但是,您可以将适当的指针与“take the address operator”
&
一起使用,这将导致指向X的指针

用p1作为参数调用函数

read(p1);
也就是说,只需按原样将指针指向X

该函数看起来应该用值填充malloced空间。

如何工作以及如何改进不是你的问题。

不要使用
get
。它已经过时了。改用。将
get(p->n)
替换为
fgets(p->n,sizeof(p->n),stdin)等等

不要将函数命名为
read
(因为这是POSIX标准的名称)。将其替换为其他名称,例如
myread

您可能想做:

X *p1=malloc(sizeof(X));
在你的主要方面。然后,您需要检查
malloc
是否成功:

if (!p1) { perror("malloc p1"); exit(EXIT_FAILURE); }
请注意,
malloc
会(在成功时)提供一些未初始化的内存区域。您可能希望使用
memset(p1,0,sizeof(p1))
清除它,或者您可以使用
p1=calloc(1,sizeof(X))

最后,您可以将其传递给您的
myread

myread(p1);
不要忘记呼叫
free(p1)
(例如,在
main
的末尾附近)以避免冲突

学会使用,它会捕获许多与内存相关的bug

当然,您需要仔细阅读您使用的每个标准函数的文档。例如,您需要
#包括
,并且调用
fgets
的文档可能会失败(您的代码需要检查这一点,另请参见&…)。同样,需要
#包含
,并且应该选中。也可能失败,需要检查

您应该使用所有警告和调试信息(
gcc-Wall-Wextra-g
with)进行编译,改进代码以避免出现警告,并且您应该;您可能希望使用GCC消毒液(例如
-fsanize=address
-fsanize=undefined
等)

提防(UB)。真的是


另外,我希望您将Linux与
gcc
一起使用,因为它是一个非常友好的开发人员系统。如果没有,请根据您的操作系统、编译器和调试工具调整我的答案。

使用、阅读和研究指针,&code>gets运算符是过时的、危险的,不应使用。改用
fgets
。花几个星期读一本好的C语言编程书。@user202729我自己研究结构,我试图获取一些数据并将其放在file.txt中。这是我想添加信息的部分。您可以通过添加您(正确地)认为您的呼叫方式错误的原因的信息来改进您的问题。例如,您可能收到编译器警告,显示它们。仍然存在问题。malloc的隐式声明,c正在读取,但n和u不是。我在问题中修改了代码。即使是您改进的问题,也不要检查
malloc
fgets
scanf
的故障。您应该添加支票;例如,当
fgets
失败时,您的代码可能会有UB(稍后),您的问题是如何使用指针参数调用函数。如果您需要有关正确使用标准函数的帮助,请另外提问。请根据他们试图回答的问题来考虑答案。两个(一个是我的,但我的意思是两个)都回答了问题。如果你同意,考虑选择帮助和接受它的那个。
myread(p1);