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中的args将具有类似的内容" Jobname 10 1"。 我需要将Jobname复制到Job [NJOBS] .jname,而我能够复制整数变量,但不复制字符串变量。我也尝试使用本地cont char数组并尝试从参数复制到局部变量它仍然无法正常工作。 请提供建议。 非常感谢帮助。
非常感谢!
答案 0 :(得分:0)
首先,如果您知道jname的最大长度,请使用char数组而不是char指针,并使用strcpy或有界strncpy将输入复制到结构中。如果没有,请为指针使用动态内存分配,并在其上使用strcpy。你应该记住在完成目的后要处理已分配的内存。
Job[NJOBS].jname = (char*)malloc(strlen(args[1])+1);
strcpy(Job[NJOBS].jname,args[1]);
//...
//...
//...
free(Job[NJOBS].jname);
正如Pablo所指出的那样,只有在填充了第零个索引时才增加NJOBS。否则,如果您使用Job [NJOBS]填充10个数据集,则会导致堆损坏。
答案 1 :(得分:0)
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
是必须返回int
的函数,您不是。{
返回任何内容,否则函数应为void cmd_run(int nargs, char **args);