使用先前分配的指针调用strlen时出现分段错误

时间:2015-06-01 07:03:51

标签: c pointers char segmentation-fault strlen

到目前为止,我已经有一些代码可以完美地处理名为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语句。有谁知道这是为什么?

3 个答案:

答案 0 :(得分:3)

编辑:

正如其他答案中所提到的,确实需要在将指针传递给strlen()之前检查NULL。在您的情况下,optarg可能包含NULL。因此,最好对empty() MACRO中的传入指针进行NULL检查。

但是,以下几点仍然有效,所以请保持原样。

我认为,您的问题可能与分配 optargwfiles的方式有关。 optarg可能会在不同的迭代中发生变化。因此,只有指向optarg可能会给您带来错误的结果。您需要复制该特定迭代的optarg内容。

不是分配(存储)指针,而是尝试

  • 将内存分配给wfiles
  • strcpy() optargwfiles

或者,您可以直接使用strdup()

答案 1 :(得分:2)

strlen()将取消引用指针,当指针(即optarg)无效时,这可能会导致一些问题。

例如,如果是optarg=NULLc='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