将指针的值复制到变量,指针作为参数传递 C 程序
Copying Value of a pointer to a variable, Pointer is passed as an argument C Program
int NJOBS=0;
struct Jobs{
char *jname;
int btime;
int priority;
int order;
}Job[10];
int cmd_run(int nargs, char **args) {
NJOBS++;
Job[NJOBS].order=NJOBS;
int bt = atoi(args[2]);
int pri = atoi(args[3]);
Job[NJOBS].btime=bt;
Job[NJOBS].priority=pri;
Job[NJOBS].jname=args[1];
}
我有一个结构来承载工作详细信息。调度程序函数正在将参数 (args) 从命令行传递到 cmd_run 函数。
cmd_run 中的参数将具有类似 "Jobname 10 1" 的内容。
我需要将 Jobname 复制到 Job[NJOBS].jname,同时我能够复制整数变量,但不会复制字符串变量。我还尝试使用本地 cont char 数组并尝试从参数复制到局部变量它仍然不起作用。
请提供建议。
非常感谢您的帮助。
非常感谢!
首先,如果您知道 jname 的最大长度,请使用 char 数组而不是 char 指针,并使用 strcpy or the bounded strncpy 将输入复制到您的结构中。如果不是,请为指针使用动态内存分配并在其上使用 strcpy。您应该记得在完成其用途后处理分配的内存。
Job[NJOBS].jname = (char*)malloc(strlen(args[1])+1);
strcpy(Job[NJOBS].jname,args[1]);
//...
//...
//...
free(Job[NJOBS].jname);
正如 Pablo 所指出的,仅当您已填充 zero-th 索引时才增加 NJOBS。否则,如果您要使用 Job[NJOBS] 来填充 10 个数据集,则会导致堆损坏。
Job[NJOBS].jname=args[1];
仅复制指针,根据 argv
的初始化方式,此指针可能会在功能中失效。您应该先为字符串分配内存,然后使用 strcpy
.
Job[NJOBS].jname = malloc(strlen(args[1]) + 1);
if(Job[NJOBS].jname == NULL)
{
// error handling
}
strcpy(Job[NJOBS].jname, args[1]);
而且你应该在函数的末尾而不是开头做 NJOBS++;
,
并且你应该检查 NJOBS
不会大于 10,否则你
正在越界访问 Job
:
int cmd_run(int nargs, char **args) {
if(NJOBS >= sizeof Job / sizeof Job[0])
return 0;
...
NJOBS++;
return 1;
}
另外你的 cmd_run
是一个必须 return 和 int
的函数,你不是
returning 任何东西,否则函数应该是 void cmd_run(int nargs, char **args);
int NJOBS=0;
struct Jobs{
char *jname;
int btime;
int priority;
int order;
}Job[10];
int cmd_run(int nargs, char **args) {
NJOBS++;
Job[NJOBS].order=NJOBS;
int bt = atoi(args[2]);
int pri = atoi(args[3]);
Job[NJOBS].btime=bt;
Job[NJOBS].priority=pri;
Job[NJOBS].jname=args[1];
}
我有一个结构来承载工作详细信息。调度程序函数正在将参数 (args) 从命令行传递到 cmd_run 函数。 cmd_run 中的参数将具有类似 "Jobname 10 1" 的内容。 我需要将 Jobname 复制到 Job[NJOBS].jname,同时我能够复制整数变量,但不会复制字符串变量。我还尝试使用本地 cont char 数组并尝试从参数复制到局部变量它仍然不起作用。 请提供建议。 非常感谢您的帮助。
非常感谢!
首先,如果您知道 jname 的最大长度,请使用 char 数组而不是 char 指针,并使用 strcpy or the bounded strncpy 将输入复制到您的结构中。如果不是,请为指针使用动态内存分配并在其上使用 strcpy。您应该记得在完成其用途后处理分配的内存。
Job[NJOBS].jname = (char*)malloc(strlen(args[1])+1);
strcpy(Job[NJOBS].jname,args[1]);
//...
//...
//...
free(Job[NJOBS].jname);
正如 Pablo 所指出的,仅当您已填充 zero-th 索引时才增加 NJOBS。否则,如果您要使用 Job[NJOBS] 来填充 10 个数据集,则会导致堆损坏。
Job[NJOBS].jname=args[1];
仅复制指针,根据 argv
的初始化方式,此指针可能会在功能中失效。您应该先为字符串分配内存,然后使用 strcpy
.
Job[NJOBS].jname = malloc(strlen(args[1]) + 1);
if(Job[NJOBS].jname == NULL)
{
// error handling
}
strcpy(Job[NJOBS].jname, args[1]);
而且你应该在函数的末尾而不是开头做 NJOBS++;
,
并且你应该检查 NJOBS
不会大于 10,否则你
正在越界访问 Job
:
int cmd_run(int nargs, char **args) {
if(NJOBS >= sizeof Job / sizeof Job[0])
return 0;
...
NJOBS++;
return 1;
}
另外你的 cmd_run
是一个必须 return 和 int
的函数,你不是
returning 任何东西,否则函数应该是 void cmd_run(int nargs, char **args);