0

我有以下代码:

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

我想通过指向函数scan_url的指针传递char数组“主机名”。但是,当我尝试时,出现以下错误:

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

该错误突出显示了我在此处发布的倒数第三行代码......特别是它强调了函数“scan_url”中的“&”。

这里发生了什么?

编辑:

我的目的是返回在 scan_url 函数中计算的主机名值。

4

4 回答 4

1

尽管有令人困惑、过度暗示的语法,但[]在您的函数参数中并不表示数组,而是表示指针。

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

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

在 C 中,数组永远不会完整地传递给函数,您只能传递指向事物的指针或指向事物数组的指针,但不能传递数组本身。这[]只是说“它是一个指针”的另一种方式,使用[]而不是的好处*是,您可以显示传递指针的意图,而不是指向单个事物,而是传递指向事物的指针,然后是其他事物喜欢它,IOW,一个指向数组元素的指针。

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

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

这几乎就是您在传递时试图推入函数的内容&hostname,因为 in是一个 63 个字符的数组main()hostname并且&hostname是一个指向 63 个字符的数组的指针。

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

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

您可能应该更改char *hostname[]char hostname[]char *hostname

于 2013-03-25T23:26:24.760 回答
1

您会收到错误消息,因为它们是根本不同的类型。您的函数需要一个指向指针的指针,但这与您要提供的指向数组的指针不同。

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

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


scan_url(url, hostname, 15);
于 2013-03-25T23:03:47.280 回答
1

您可以像这样声明 scan_url :

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

并这样称呼它:

int help = scan_url(url, hostname, 15);
于 2013-03-25T23:07:21.533 回答
1

通常将指针和数组表示法都指定为函数参数是多余的,因为它们都被视为相同 - 作为指针。将它们结合起来意味着您正在尝试传递一个指针数组,或者更确切地说是一个指向指针的指针。

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

int scan_url(const char url[], char hostname[], int maxhostlen)
于 2013-03-25T23:07:52.457 回答