复制指向变量的指针的值,Pointer作为参数C程序传递

时间:2018-03-12 01:27:08

标签: c arrays string pointers pass-by-reference

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数组并尝试从参数复制到局部变量它仍然无法正常工作。 请提供建议。 非常感谢帮助。

非常感谢!

2 个答案:

答案 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);