冲突类型在C中传递String函数时发出警告

时间:2011-04-27 13:04:32

标签: c

我没有在C中编程一段时间,并且在将字符串传递给函数时遇到了问题。 代码有效,但是我收到gcc的警告。

我用我的主要调用函数:

copyToCode(code, section1, section2);

功能是:

void copyToCode (char **code, char *loc, char *data ){}

我在包含该函数的行上获得了“copyToCode的冲突类型”,并且“调用该函数的行上有”copyToCode的先前隐式声明在这里“警告。

我已声明变量:

char *code = malloc (32*1000* sizeof(char));

char *section1 = malloc(8*sizeof(char)), *section2 = malloc(8*sizeof(char));

我也试过这个: char *section1[8];

作为一个附带问题 - 这是正确的吗?

section1和section2是字符串,代码是字符串数组。

感谢阅读,感谢您的帮助。 加雷

4 个答案:

答案 0 :(得分:3)

您需要在调用之前声明该函数,否则编译器将尝试找出代表您的函数原型。

消息

  

copyToCode之前的隐式声明

告诉你这个。隐式声明是编译器生成的声明,因为您还没有给它一个明确的声明。


在您对问题的更新中,您说code旨在成为字符串数组,但您将其定义为:

char *code = malloc (32*1000* sizeof(char));

分配一个字符串。字符串数组将保存在char**中,就像argv一样。您需要首先分配数组,其中包含n个字符串,每个字符串都是char*。然后你必须逐个分配每个char*

使用标准库字符串和矢量类,这种编码在C ++中更容易。

答案 1 :(得分:0)

您能否提供有关您使用的变量作为函数参数的更多详细信息?

另外值得注意的是,copyToCode的第一个参数是pointer to a pointer of chars,可以用作array of strings

该行:

void copyToCode (char **code, char *loc, char *data ){}

是你的功能声明吗?在这种情况下,你应该这样写:

void copyToCode (char **code, char *loc, char *data );

答案 2 :(得分:0)

此警告表示您的声明与实现不同。或者你有两个不同的函数声明。

因为警告提到了隐式声明,这意味着声明是由gcc推断的,因为你在声明它之前使用了该函数。 GCC将使用函数调用的参数来推断声明,这可能导致令人讨厌的问题。

如果声明该函数,您可能仍会收到错误,但它应该更加具体。

旁注:如果您正在使用gcc,请始终编译为gcc -std=c99 -pedantic -Wall -Wextra -Wwrite-strings source.c

编辑:您的变量是错误的。代码为char *,但您的函数需要char **

答案 3 :(得分:0)

要定义字符串数组,您需要以下内容:

char **code;
int i;
code = malloc (32*sizeof(*code));
for (i=0; i<32; i++) {
  code[i]=malloc(1000*sizeof(**code));
}

请注意,这不包括对malloc结果的错误检查,您应该这样做。它创建了一个大小为32的数组,其中包含大小为1000的字符串,您不应该对其进行硬编码。