通过函数中的指针传递字符数组

时间:2013-03-25 23:02:14

标签: c arrays pointers

我有以下代码:

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

int scan_url(const char url[], char *hostname[], int maxhostlen) {
//stuff the function does...probably not relevant to this question
}
int main() {
    char url[63] = {'\0'};
    char hostname[63] = {'\0'};
    int help = scan_url(url, &hostname, 15);
    return(0);
}

我想通过指针将char数组“hostname”传递给函数scan_url。但是,当我尝试时,我收到以下错误:

  

错误C2664:'scan_url':无法将参数2从'char(*)[63]'转换为'char * []'

错误突出显示我在此处发布的第三行到最后一行代码...特别强调了“&amp;”在函数“scan_url”中。

这里发生了什么?

编辑:

我的目的是返回scan_url函数中计算的hostname的值。

4 个答案:

答案 0 :(得分:1)

您收到错误,因为这些是根本不同的类型。你的函数期望指向指针,但这与指向数组的指针不同,这是你想要提供的。

如果要写入提供的字符数组,则只需传递一个普通指针:

int scan_url(const char url[], char hostname[], int maxhostlen) {
    strcpy(hostname, "blah");  // or whatever
}


scan_url(url, hostname, 15);

答案 1 :(得分:1)

您可以像这样声明scan_url:

int scan_url(const char url[], char hostname[], int maxhostlen) {

并称之为:

int help = scan_url(url, hostname, 15);

答案 2 :(得分:1)

通常将指针和数组表示法指定为函数参数是多余的,因为它们都被视为指针。组合它们意味着你试图传递一个指针数组,或者更确切地说是一个指向指针的指针。

为了与其他声明保持一致,只需取出*

int scan_url(const char url[], char hostname[], int maxhostlen)

答案 3 :(得分:1)

尽管语法混乱,过于暗示,但函数参数中的[]并不意味着数组,它意味着指针。

因此,当char url[]作为函数参数出现时,url具有指向char的指针类型,而不是字符数组的类型。

类似地,当char *hostname[]作为函数参数出现时,hostname具有指向char的指针的类型,而不是指向char的指针数组的类型。

在C中,数组永远不会完整地传递给函数,只能将指针传递给指向事物数组的事物或指针,而不能传递数组本身。并且[]只是用来表示“它是指针”的另一种方式,使用[]代替*的好处是你可以显示传递指针的意图不是一个东西,但指向一个东西,然后是其他类似的东西,IOW,一个指向数组元素的指针。

OTOH,如果你有char something[][10]作为函数参数,something将具有指向10个字符数组的指针类型。第一个[]将“衰减”为*

如果您将char (*something)[10]作为函数参数,something将具有指向10个字符数组的指针类型。此处[]*没有“衰减”,因为something已经是指针。

这几乎是你在传递&hostname时试图推入函数的原因,因为在main()中,hostname是一个包含63个字符和{{1}的数组}是一个指向63个字符数组的指针。

但是,如前所示,函数中&hostname参数的实际类型是指向char的指针。

因此,你传递的内容和函数所期望的是不兼容的东西,它们具有完全不同的类型:指向63个字符数组的指针与指向char的指针的指针。这就是你所看到的编译错误的原因。

您应该将hostname更改为char *hostname[]或更改为char hostname[]