我不明白如何在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);
}
答案 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 -g
与scanf(3)),改进您的代码以获取警告,您应该GCC;您可能希望使用GCC清洁剂(例如-fsanitize=address
,例如-fsanitize=undefined
,gcc
和其他人),
小心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,因为它是一个非常开发人员友好的系统。如果没有,请根据您的操作系统,编译器和调试工具调整我的答案。