C 如何使用指针参数调用void函数?
我不明白如何在main中正确调用此函数。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
我试着这样调用:
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);