在内联c中避免使用无效的initlaliser

时间:2012-11-20 12:55:58

标签: c varnish

我有一个函数原型,它为我提供了我想要的结果:

#include <stdio.h>
#include <string.h>

int main ()
{
  char * pch;
  char str[] = " 81.243.230.174, 10.1.0.102";
  pch = (char*) memchr (str, ',', strlen(str));
  char * tch;
  memcpy (tch, str, pch-str);
  if (pch!=NULL){
    printf ("',' found at position %ld.\n", pch-str);
    printf ("XFF: %s\n", tch);
  } else {
    printf ("',' not found.\n");
  }
  return 0;
}

返回以下内容:     $&gt;','在第15位找到。     $&gt; XFF:81.243.230.174

我想从libvcl处理VRT_GetHdr的输出,如下所示:

char * pch;
char str[] = VRT_GetHdr(sp, HDR_REQ, "\023X-FF:");
pch = (char*) memchr (str, ',', strlen(str));
char * xff;
memcpy (xff, str, pch-str);

    if (get_country_code)
            VRT_SetHdr(sp, HDR_REQ, "\017X-Country-Code:", (*get_country_code)(xff), vrt_magic_string_end);

VRT_GetHdr返回一个char指针,编译器会抱怨“初始化程序无效。”

如果我改变了作业     char str [] 至     char * str ,varnish在运行时死掉(可能带有段错误)。 如何在不使用上面指向数组乱的指针的情况下从内联C获得预期结果?

2 个答案:

答案 0 :(得分:1)

一旦超过编译器错误,就会出现seg错误。在复制之前,您需要为xff分配内存。

char * pch;
char* str = VRT_GetHdr(sp, HDR_REQ, "\023X-FF:");
pch = (char*) memchr (str, ',', strlen(str));
char* xff = malloc(pch-str);
memcpy (xff, str, pch-str);
/* use xff as required */
free(xff);

答案 1 :(得分:0)

你不能。

初始化表达式必须是文字的,以提供编译时大小,而函数调用则不是。

您可以使用C99的自动阵列来解决这个问题,但是使用动态分配的阵列(使用malloc()strdup(),如果有的话)可能更简单,更清晰。< / p>

如果您有理由相信返回值的长度有一些限制,或者甚至是“足够大”的静态限制。

您的代码有点像strtok()的重新实现,也许您可​​以直接使用它?