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

时间:2018-02-23 06:26:49

标签: c

我不明白如何在main中正确调用此功能 我试着这样打电话:X *p1=malloc(sizeof(X));read(&p1);

struct x
{   int c;
    char n[250];
    char u[150];
};
typedef struct x X;

void myread(X *p);

void myread(X *p)
{
    scanf("%d",&p->c);
    fgets(p->n,sizeof(p->n),stdin);
    fgets(p->u,sizeof(p->u),stdin);
}
void main(){
    X *p1;
    p1=malloc(sizeof(X));
    myread(p1);
}

2 个答案:

答案 0 :(得分:3)

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

就是这样。

然后,您使用适当的指针与“取地址运算符”&,这将导致指向X的指针。

使用p1作为参数调用函数看起来像

read(p1);

即。只需将指针指向X.

该函数看起来应该用值填充malloced空间 如何运作以及如何改进它不是你问题的一部分。

答案 1 :(得分:2)

不要使用gets。它是dangerous并且已过时。请改用fgets。将gets(p->n)替换为fgets(p->n, sizeof(p->n), stdin);,依此类推。

不要将您的函数命名为read(因为这是POSIX标准function的名称)。将其替换为其他名称,例如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附近)以避免memory leak

学习使用valgrind,它会捕获许多与内存相关的错误。

当然,您需要仔细阅读您使用的每个标准功能的文档。例如,#include <stdio.h>所需的fgets(3)个文档,以及对fgets的调用可能会失败(您的代码需要检查它,另请参阅errno(3)&amp; {{ 3}} ...)。同样,perror(3)需要#include <stdlib.h>并且应该进行检查。 malloc(3)也可能失败,需要进行检查。

您应编译所有警告和调试信息(gcc -Wall -Wextra -gscanf(3)),改进您的代码以获取警告,您应该GCC;您可能希望使用GCC清洁剂(例如-fsanitize=address,例如-fsanitize=undefinedgcc和其他人),

小心use the gdb debugger(UB)。这真的是instrumentation options

PS。我希望您使用的是 Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); try { context.startActivity(intent); } catch (ActivityNotFoundException e) { Log.e(TAG, e.getMessage()); } Linux,因为它是一个非常开发人员友好的系统。如果没有,请根据您的操作系统,编译器和调试工具调整我的答案。