0

我的目标是修改vcprompt,使其需要额外的参数,该参数明确指定哪个 VCS 显示状态。以下是更改的要点:

typedef struct {
    int debug;
    char *format;                       /* e.g. "[%b%u%m]" */
    int show_branch;                    /* show current branch? */
    int show_revision;                  /* show current revision? */
    int show_patch;                     /* show patch name? */
    int show_unknown;                   /* show ? if unknown files? */
    int show_modified;                  /* show + if local changes? */
    unsigned int timeout;               /* timeout in milliseconds */
    char *vcs;                          /* e.g. "git", "hg" */
} options_t;

...

options_t options = {
    .debug         = 0,
    .format        = format,
    .show_branch   = 0,
    .show_revision = 0,
    .show_unknown  = 0,
    .show_modified = 0,
    .vcs           = NULL
};

...

int opt;
while ((opt = getopt(argc, argv, "hf:dt:v:")) != -1) {
    switch (opt) {
        case 'f':
            options->format = optarg;
            break;
        case 'd':
            options->debug = 1;
            break;
        case 't':
            options->timeout = strtol(optarg, NULL, 10);
            break;
        case 'v':
            printf("%s %s", options->vcs, optarg);
            //options->vcs = optarg;
            break;
    ...
}

当我像这样调用程序时./vcprompt -v foo, printf 将以下内容放在输出中:(null) git. 如果我取消注释 printf 下面的分配,我会遇到分段错误。

这可能是什么原因?在我看来,我正在做的事情与vcs正在做的事情相同format。我在 64 位 Windows 上的 cygwin 中运行它。

编辑

这是格式的定义

#define DEFAULT_FORMAT "[%n:%b] "
...
char *format = getenv("VCPROMPT_FORMAT");
if (format == NULL)
    format = DEFAULT_FORMAT;
4

2 回答 2

2

改变这个

while ((opt = getopt(argc, argv, "hf:dt:v:")) != -1) {
    switch (opt) {
        case 'f':
            options->format = optarg;
            break;
...

对此

while ((opt = getopt(argc, argv, "hf:dt:v:")) != -1) {
    switch (opt) {
        case 'f':
            options->format = strdup(optarg);
            break;

...

这样,在堆上制作并分配选项的副本 -vcs成员也是如此。

于 2013-03-20T12:36:59.093 回答
0

您没有分配给formatvcs指向的任何存储空间。照原样,它们只是指针。如果你想让它们指向一个字符串,你需要空间来存储字符串数据本身加上一个终止符('\0')的空间。处理它的一种方法是调用strlen()选项来获取它的长度,然后使用该信息,以便您可以使用malloc()分配足够大的空间来容纳完整的 C 字符串,然后让结构中的指针指向该内存块.

于 2013-03-20T12:24:11.870 回答