我没有在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是字符串,代码是字符串数组。
感谢阅读,感谢您的帮助。 加雷
答案 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的字符串,您不应该对其进行硬编码。