我有以下代码:
#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的值。
答案 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[]
。