到目前为止,我已经有一些代码可以完美地处理名为wfiles
的变量。 wfiles在我的主文件中初始化:
char* wfiles = "";
据我所知,C没有抱怨。接下来,wfiles
变量在switch语句中分配:
switch (c) {
case 't':
/* the user wants a template */
template = optarg;
break;
case 'f':
wfiles = optarg;
break;
case 'v':
vcs = optarg;
break;
case 'u':
url = optarg;
break;
case 's':
/* custom save location */
save_loc = optarg;
break;
case '?':
break;
default:
abort();
}
最后我检查wfiles
是否为空:
if (!empty(wfiles))
empty是一个扩展为(strlen(wfiles) == 0)
我看不出有任何问题,但是当我运行此代码时,我遇到了分段错误。这从未发生过。当我使用和不使用调试符号在gdb中运行代码时,我得到一行指向前面提到的if语句。有谁知道这是为什么?
答案 0 :(得分:3)
编辑:
正如其他答案中所提到的,确实需要在将指针传递给strlen()
之前检查NULL。在您的情况下,optarg
可能包含NULL。因此,最好对empty()
MACRO中的传入指针进行NULL检查。
但是,以下几点仍然有效,所以请保持原样。
我认为,您的问题可能与分配 optarg
到wfiles
的方式有关。 optarg
可能会在不同的迭代中发生变化。因此,只有指向到optarg
可能会给您带来错误的结果。您需要复制该特定迭代的optarg
内容。
不是分配(存储)指针,而是尝试
wfiles
。strcpy()
optarg
至wfiles
。或者,您可以直接使用strdup()
。
答案 1 :(得分:2)
strlen()
将取消引用指针,当指针(即optarg
)无效时,这可能会导致一些问题。
例如,如果是optarg=NULL
和c='f'
,您的代码将执行为:
case 'f':
wfiles = optarg;
//Now wfiles=NULL
strlen(wfiles)
将:strlen(NULL)
并发生分段错误。
有关详情,请参阅this related question
答案 2 :(得分:2)
您可能希望通过1 st 测试宏empty
,以便在调用NULL
之前测试其参数是否指向strlen()
。
#define empty(s) (s) ?(0 == strlen(s)) :1