当前位置: 首页 > 知识库问答 >
问题:

将字符指针数组传递给C中的函数?

翁翰
2023-03-14

我有以下代码:

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]

我正在努力理解问题是什么。

共有3个答案

司知
2023-03-14
匿名用户

你有几个问题。首先是原型错误。a的数据类型在传递给函数时衰减为char指针,因此您需要:

int test (char* s1, char** s2) { ... }

然而,即使您解决了这个问题,当您第一次使用它时,测试声明也不在范围内。您应该提供一个原型:

int test (char* s1, char** s2);

main之前,或者简单地将整个定义(函数)移动到main之前。

此外,不要忘记#include字符串. h和stdlib. h标头,以便strcmpmalloc的原型也可用。

丌官寒
2023-03-14

错误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)
陆建木
2023-03-14

首先,您应该包含必要的头文件。对于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 () {