我的目标是以某种方式修改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
进行的工作相同。我在cygwin上的64位Windows上运行它。编辑
这是格式的定义
#define DEFAULT_FORMAT "[%n:%b] "
...
char *format = getenv("VCPROMPT_FORMAT");
if (format == NULL)
format = DEFAULT_FORMAT;
最佳答案
改变这个
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
成员也是如此。关于c - 分配给作为结构成员的指针会导致段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15523328/