如何将指针传递给类型为fixed size array的函数参数?

时间:2017-08-14 09:38:55

标签: c arrays pointers casting

我需要编写一个lib包装器。我的包装函数原型看起来像这样

void my_function(char config[CONFIGSTRSIZE]);

要包装的功能如下所示。

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

我尝试执行以下操作:

r

这编译并运行但我收到错误。告诉我,论证是一种无效的类型。

  

从指针目标类型

中丢弃限定符

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

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

2 个答案:

答案 0 :(得分:1)

首先,以下函数声明没有多大意义,尽管是合法的:

void my_function(char config[CONFIGSTRSIZE]);

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

void my_function(char *config);

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

void my_function(char config[]);

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

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

    void my_function(const char *config);
    
  2. my_function()也会修改数组。然后你不能在那里传递一些常量数据,但你可能会对数据进行复制。假设数据是一个字符串,一种方法是:

    // 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);
    }
    

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

答案 1 :(得分:1)

  

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

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