【问题标题】:Copying Value of a pointer to a variable, Pointer is passed as an argument C Program将指针的值复制到变量,指针作为参数传递 C 程序
【发布时间】:2018-08-19 23:34:39
【问题描述】:
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 数组并尝试从参数复制到本地变量它仍然不起作用。 请提供建议。 非常感谢您的帮助。

非常感谢!

【问题讨论】:

  • C 中没有pass-by-reference,都是pass-by-value。传递指针只是将地址按值传递给某物的一种方式,依此类推……

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


【解决方案1】:

首先,如果您知道 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 个数据集,则会导致堆损坏。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 非常感谢您的回复!还帮我解决了另一个问题。
    猜你喜欢
    • 1970-01-01
    • 2021-01-22
    • 2014-04-16
    • 2012-01-24
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多