【问题标题】:Avoid invalid initlaliser in inline c避免内联 c 中的无效初始化程序
【发布时间】:2018-11-23 18:09:52
【问题描述】:

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

#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;
}

返回以下内容: $>',' 位于第 15 位。 $>XFF: 81.243.230.174

我想把libvcl的VRT_GetHdr的输出处理成上面的str,如下:

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 指针,编译器抱怨“初始化程序无效”。

如果我改变分配 字符字符串 [] 至 字符 *str ,清漆在运行时死掉(可能有段错误)。 如何在不使用上述指向数组混乱的指针的情况下从我的内联 C 中获得预期结果?

【问题讨论】:

标签: c varnish


【解决方案1】:

一旦您克服了编译器错误,您就会遇到段错误。您需要在复制到 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);

【讨论】:

    【解决方案2】:

    你不能。

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

    您也许可以使用 C99 的自动数组来解决这个问题,但只使用动态分配的数组(使用 malloc()strdup(),如果有的话)可能更容易和更简洁。

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

    你的代码读起来有点像strtok()的重新实现,或许你可以直接使用?

    【讨论】:

    • 那么有什么更好的方法可以让字符串指针的第一部分到达分隔符?
    猜你喜欢
    • 2013-03-19
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    相关资源
    最近更新 更多