将命令行参数作为参数传递给c

时间:2015-06-02 17:18:06

标签: function struct command-line-arguments

我试图创建一个函数来为结构成员分配一个值。

#include <stdio.h>
#include <string.h>

typedef struct 
{
   int id;
   char *data;
}person_t;

person_t person_build(int id, char *data);


int main (int argc, char *argv[])
{
     person_t person = person_build(atoi(argv[1]), argv[2]);
     return 0;
}

person_t person_build(int id, char *data)
{
    person_t person;
    person.id = id;
    strcpy(person.data, data);

    return person;
}

该程序编译成功。

我运行该程序并将命令行参数作为参数 以person_build()作为参数。

>struct5.exe 4 Something

操作系统(Windows 7)给我一个警告this program has stopped working

但是在没有任何命令行参数的情况下运行(更改命令行参数以外的person_build()参数)该程序可以运行。

有人可以解释为什么会发生这种行为吗?

1 个答案:

答案 0 :(得分:0)

您的程序无法正常工作,因为您正在访问尚未初始化的内存结构。具体做法是:

typedef struct 
{
   int id;
   char *data;
}person_t;

这会创建一个char *作为成员的结构。 char *不分配任何实际内存,它只是在结构中保留一个成员,该成员可以保存应该指向值的内存地址。后来,你:

strcpy(person.data, data);

您现在正在将数据复制到person.data指向的内存位置,即使您从未分配过内存或已初始化person.data

你可以采取这种方法:

person_t person_build(int id, char *data)
{
    person_t person;
    person.id = id;
    person.data = malloc(sizeof(char) * strlen(data) + 1);
    if(person.data != NULL) strcpy(person.data, data);
    return person;
}

这会分配适当大小的内存,在字符串末尾计算空终止,验证分配是否成功,然后才会尝试复制到该内存。

这远未完成。我想你可能还有很多障碍需要克服!