【问题标题】:How to pass a pointer to a function argument of type fixed size array? [closed]如何将指针传递给固定大小数组类型的函数参数? [关闭]
【发布时间】:2017-08-14 09:38:55
【问题描述】:

我需要编写一个 lib 包装器。我的包装函数原型是这样的

int my_wrapper(char * configstr);

要包装的函数如下所示。

void my_function(char config[CONFIGSTRSIZE]);

我尝试执行以下操作:

int my_wrapper(char * configstr)
{
   my_function(configstr);
   return 0;
}

这可以编译并且可以工作,但是我收到一个错误。告诉我参数是无效类型。

从指针目标类型中丢弃限定符

有没有办法执行强制转换以告诉编译器调用函数的指针始终是适当大小的指针?

更改接口或多或少是不可能的。我感谢您的反馈。

【问题讨论】:

  • void my_function(char config[CONFIGSTRSIZE])void my_function(char *config)相同
  • 您不需要任何 包装器。很可能,您只是想传递const char *?显示您的呼叫代码...
  • 请注意,char ()[size]char *不是同一类型。但是由于不可能传递一个数组,所以如果你在函数声明中写了数组类型,它会自动调整为相应的指针类型。因此,声明确实与@OliverCharlesworth 指出的相同
  • 您发布了错误的代码。在实际代码中,某些函数使用了const 限定符。因此,您的问题在当前状态下无法回答。
  • @Schafwolle 好吧,这不会使您的程序定义。演员表基本上告诉编译器“闭嘴,我知道我在做什么”。

标签: c arrays pointers casting


【解决方案1】:

有没有办法执行强制转换来告诉编译器 调用函数的指针始终是正确的指针 尺寸?

这在 C 中是不可能的。指针没有关于大小的信息。您需要将其作为附加参数传递或在取消引用的对象中包含此信息(例如,首先是大小,或终止值,如 C 字符串)

【讨论】:

    【解决方案2】:

    首先,下面的函数声明虽然合法,但意义不大:

    void my_function(char config[CONFIGSTRSIZE]);
    

    它给人一种错误的印象,即您可以通过某种方式传递一个数组(具有固定大小)。你不能在 C 中。实际发生的是 C 将函数声明中的任何数组类型调整为相应的指针类型,所以这个声明最终只是

    void my_function(char *config);
    

    可以这样写,以强调传递的指针应该指向一个数组(我不想这样做,但这是风格问题):

    void my_function(char config[]);
    

    现在对于您的问题,根据您收到的错误消息,您可能正在尝试在此处传递const-qualified 指针。根据my_function() 的做法,有两种解决方案:

    1. my_function()读取数组。然后你应该像这样改变函数原型:

      void my_function(const char *config);
      
    2. my_function() 也会修改数组。然后你不能在那里传递一些 const 数据,但你可能会获取数据的副本。假设数据是一个字符串,一种方法如下:

      // having some const char *config
      char *cfgcopy = malloc(strlen(config)+1);
      
      if (cfgcopy) { // allocation succeeded
          strcpy(cfgcopy, config);
          my_function(cfgcopy);
          // do something with the modified cfgcopy
          free(cfgcopy);
      }
      

      许多实现提供了一个“速记”strdup() 函数,而不是 malloc()/strcpy(),您可以使用它。但请注意 strdup() 不是标准 C 的一部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      • 2012-11-26
      • 1970-01-01
      • 2011-03-14
      相关资源
      最近更新 更多