将指针的值复制到变量,指针作为参数传递 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);