我有以下代码:
int main(){
char **array;
char a[5];
int n = 5;
array = malloc(n *sizeof *array);
/*Some code to assign array values*/
test(a, array);
return 0;
}
int test(char s1, char **s2){
if(strcmp(s1, s2[0]) != 0)
return 1;
return 0;
}
我正在尝试将char和char指针数组传递给函数,但上面的代码会导致以下错误和警告:
temp.c: In function ‘main’: temp.c:6:5: warning: implicit declaration of function ‘malloc’ [-Wimplicit-function-declaration] temp.c:6:13: warning: incompatible implicit declaration of built-in function ‘malloc’ [enabled by default] temp.c:10:5: warning: implicit declaration of function ‘test’ [-Wimplicit-function-declaration] temp.c: At top level: temp.c:15:5: error: conflicting types for ‘test’ temp.c:15:1: note: an argument type that has a default promotion can’t match an empty parameter name list declaration temp.c:10:5: note: previous implicit declaration of ‘test’ was here temp.c: In function ‘test’: temp.c:16:5: warning: implicit declaration of function ‘strcmp’ [-Wimplicit-function-declaration]
我正在努力理解问题是什么。
你有几个问题。首先是原型错误。a
的数据类型在传递给函数时衰减为char指针,因此您需要:
int test (char* s1, char** s2) { ... }
然而,即使您解决了这个问题,当您第一次使用它时,测试声明也不在范围内。您应该提供一个原型:
int test (char* s1, char** s2);
在main
之前,或者简单地将整个定义(函数)移动到main
之前。
此外,不要忘记#include
字符串. h和stdlib. h
标头,以便strcmp
和malloc
的原型也可用。
错误1
temp.c:6:13: warning: incompatible implicit declaration of
built-in function ‘malloc’ [enabled by default]
你是这个意思吗?
array = malloc(n * sizeof(*array));
错误2
temp.c:15:5: error: conflicting types for ‘test’
temp.c:15:1: note: an argument type that has a default promotion can’t
match an empty parameter name list declaration
temp.c:10:5: note: previous implicit declaration of ‘test’ was here
您正在传递数组a的第一个元素的地址:
test(a, array);
因此,函数签名应该是:
int test(char* s1, char** s2)
首先,您应该包含必要的头文件。对于strcmp
,您需要
temp.c: In function ‘test’:
temp.c:20:5: warning: passing argument 1 of ‘strcmp’ makes pointer from integer without a cast [enabled by default]
/usr/include/string.h:143:12: note: expected ‘const char *’ but argument is of type ‘char’
这表明
test()
应该有一个char*
作为第一个参数。总之,您的代码应该如下所示:
#include <string.h> /* for strcmp */
#include <malloc.h> /* for malloc */
int test(char*,char**); /* added declaration */
int main(){
char **array;
char a[5];
int n = 5;
array = malloc(sizeof(*array));
array[0] = malloc(n * sizeof(**array));
/*Some code to assign array values*/
test(a, array);
free(*array); /* free the not longer needed memory */
free(array);
return 0;
}
int test(char * s1, char **s2){ /* changed to char* */
if(strcmp(s1, s2[0]) != 0) /* have a look at the comment after the code */
return 1;
return 0;
}
请注意,strcmp可以处理以null结尾的字节字符串。如果s1和s2都不包含空字节,则调用测试将导致分段错误:
[1] 14940 segmentation fault (core dumped) ./a.out
要么确保两者都包含空字节,要么使用strncmp并更改测试的签名:
int test(char * s1, char **s2, unsigned count){
if(strncmp(s1, s2[0], count) != 0)
return 1;
return 0;
}
/* don' forget to change the declaration to
int test(char*,char**,unsigned)
and call it with test(a,array,min(sizeof(a),n))
*/
您的内存分配也是错误的。
数组
是一个char**
。您为*数组
分配内存,它本身就是一个char*
。您永远不会为此特定指针分配内存,您缺少数组[0]=malloc(n*sizeof(**数组))
:
array = malloc(sizeof(*array));
*array = malloc(n * sizeof(**array));
C++ 指针 C++ 允许您传递指针给函数,只需要简单地声明函数参数为指针类型即可。 下面的实例中,我们传递一个无符号的 long 型指针给函数,并在函数内改变这个值: #include <iostream> #include <ctime> using namespace std; void getSeconds(unsigned long *par); int main () {
C编程允许将指针传递给函数。 为此,只需将函数参数声明为指针类型即可。 下面是一个简单的例子,我们将一个无符号长指针传递给一个函数,并改变函数内部的值,该值反映在调用函数中 - #include <stdio.h> #include <time.h> void getSeconds(unsigned long *par); int main () { unsigned long sec;
问题内容: 背景:使用cgo从Golang调用C函数。 我想使用具有以下签名的C函数:。它会修改的数据和,这就是为什么它使用指针,它们的原因。的值是的长度;是一个字符串数组;返回值只是一个(布尔)指示符,用于指示是否存在错误。 在golang中,我可以使用来成功传递和修改。通过使用。示例代码如下: 如您所见,C函数当前为,但我想要的是。 这就是说:我真正想要的是在C中启用对字符串数组的修改(例如,
Objective-C编程语言允许您传递指向函数的指针。 为此,只需将函数参数声明为指针类型即可。 下面是一个简单的例子,我们将一个无符号长指针传递给一个函数并更改函数内部的值,该函数反映在调用函数中 - #import <Foundation/Foundation.h> @interface SampleClass:NSObject - (void) getSeconds:(int *)par;
我编写了一个代码来传递函数指针列表(按其名称)作为参数。但我有错误。你能解释为什么我在做地图时有错误吗? 错误: 34:18:错误:无法将'void(Bar::)(int, int)'转换为'std::map, void(*)(int, int) 35:18:错误:无法将“无效(foo::)(整数,整数)”转换为“标准::映射,无效(*)(整数,整型) 41:70:错误:没有用于调用“std::v
C ++允许您传递指向函数的指针。 为此,只需将函数参数声明为指针类型即可。 下面是一个简单的例子,我们将一个无符号长指针传递给一个函数并更改函数内部的值,该函数反映在调用函数中 - #include <iostream> #include <ctime> using namespace std; void getSeconds(unsigned long *par); int main () {