我可以使用此指针多远?

时间:2011-03-21 21:30:19

标签: c string memory pointers reference

假设 if(websValidateUrl(wp,path)< 0)在下面的函数中为真:

  int websDefaultHandler(webs_t wp, char_t *urlPrefix, char_t *webDir, int arg,
                            char_t *url, char_t *path, char_t *query)
    {
        websStatType    sbuf;
        char_t          *lpath, *tmp, *date;
        int             bytes, flags, nchars;

    a_assert(websValid(wp));
    a_assert(url && *url);
    a_assert(path);
    a_assert(query);

/*
 *  Validate the URL and ensure that ".."s don't give access to unwanted files
 */
    flags = websGetRequestFlags(wp);

    if (websValidateUrl(wp, path) < 0)         
    {
        websError(wp, 500, T("Invalid URL %s"), url); //points to valid string "/index.html"
        return 1;
    }
}  
然后将

url传递到此处,其中fmt使用va_start()进行迭代:

void websError(webs_t wp, int code, char_t *fmt, ...)
{
    va_list     args;
    char_t      *msg, *userMsg, *buf;
   char_t*     safeUrl = NULL;
   char_t*     safeMsg = NULL;
#ifdef qRichErrorPage
   static int reEntry = 0;
   int errorOk;
#endif

    a_assert(websValid(wp));
    a_assert(fmt);

    websStats.errors++;

   /* remove any dangerous characters in the url, and replace the string in the 
    * wp structure. The webs_t cleanup code will free this memory for us.
    */
   safeUrl = websSafeUrl(wp->url);
   bfreeSafe(B_L, wp->url);
   wp->url = safeUrl;

    va_start(args, fmt);  //AT this point args is a bad pointer??
    userMsg = NULL;
    fmtValloc(&userMsg, WEBS_BUFSIZE, fmt, args);
    va_end(args);
.
.
.

当我们到达va_start(args, fmt);时,args包含一些奇怪的字符,而不是我期待的“/index.html”。

这个指针的分配级别高于第一个函数但不应该仍然存在,因为它在websDefaultHandler中有效吗?

一般来说,做这样的事情的最佳做法是什么?在将它传递给websError()之前,我是否需要在websDefaultHandler中再次为它分配memoery?

感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

使用args初始化va_start后,您应该使用va_arg来检索实际值。

答案 1 :(得分:1)

(已经在评论中说过了,但是由于这似乎是问题所在,因此我会提出一个实际答案:)

如果发送到url的{​​{1}}与websError是相同的字符串(即同一块内存),则调用wp->urlbfreeSafe尝试使用它之前释放它,在这种情况下,如果fmtValloc看到一些乱码就不足为奇了。