关于不兼容的指针类型-c的警告



我从main调用我的函数…

int main() {
char* input[81];
char** array[81];
userInput(input);
parseInput(input);
}

userInput接收输入并存储在输入变量中。这是正确的工作。

但现在我想将输入和一个char指针数组发送到我的parseInput函数,以使用strtok 将输入解析为数组

下面是我的parseInput((函数。。。

void parseInput(char* in) {
char *tok = strtok(in, " ");
int i = 0;
while(tok != NULL) {
array[i] = tok;
tok = strtok(NULL, " ");
i++;
}
}

当我试图编译时,我收到了以下警告,我不明白为什么。

警告:从不兼容的指针类型传递"userInput"的参数1[默认情况下启用]userInput(input(;

警告:正在从不兼容的指针类型传递"parseInput"的参数1[默认情况下启用]parseInput(输入,数组(;

如有任何指导,我们将不胜感激。谢谢

您将函数parseInput定义为接受类型为char*的参数,但在函数main中,您将向其传递类型为char**的衰减参数。这就是编译器抱怨指针类型不兼容的原因。

代替

char* input[81];

你可能应该写:

char input[81];

此外,申报

char** array[81];

可能应该改为:

char* array[81];

此外,正如在注释部分中已经指出的,函数parseInput将不会编译,因为它引用了标识符array,但该函数看不到具有该名称的标识符。它看不到函数main的标识符array。因此,如果希望函数parseInput能够访问函数main中的array,那么在调用parseInput时,必须将指针传递给该数组。

代码的另一个问题是,函数parseInput的行为没有意义,因为该函数的调用方(在本例中为main(无法知道parseInput写入了指针数组的多少元素。因此,它无法知道函数调用后数组中有多少元素是有效的。因此,让函数parseInput返回一个指定写入的数组元素数的int可能更有意义。

另一个问题是函数parseInput只是假设传递的数组足够大。如果这个假设是错误的,那么它将导致缓冲区溢出。因此,设计函数parseInput可能更安全,因为它还传递了一个指定传递数组大小的参数,这样函数就可以在缓冲区溢出发生之前停止。

在应用了上述所有修改后,函数parseInput将如下所示:

int parseInput( char* in, char** results, int results_length )
{
char *tok = strtok(in, " ");
int i = 0;
while( tok != NULL && i < results_length )
{
results[i] = tok;
tok = strtok(NULL, " ");
i++;
}
return i;
}

而不是像这个那样调用函数

parseInput(input);

你现在可以这样称呼它:

int main(void)
{
char input[81] = "This is a test.";
char* array[81];
int num_elements;
num_elements = parseInput( input, array, sizeof array / sizeof *array );
for ( int i = 0; i < num_elements; i++ )
{
printf( "%sn", array[i] );
}
return 0;
}

该测试程序提供以下输出:

This
is
a
test.

相关内容

  • 没有找到相关文章

最新更新