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

use*_*057 4 c arrays pointers char

我有以下代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试将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]

我试图了解问题所在.

Zet*_*eta 7

首先,您应该包含必要的头文件.为了strcmp你的需要<string.h>,为malloc <malloc.h>.你还需要 main 之前至少声明测试.如果这样做,您会注意到以下错误:

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;
}
Run Code Online (Sandbox Code Playgroud)

编辑

请注意,strcmp使用以null结尾的字节字符串.如果既不包含s1也不s2包含空字节,则调用test将导致分段错误:

[1]    14940 segmentation fault (core dumped)  ./a.out

要么确保两者都包含空字节'\0',要么使用strncmp和更改签名test:

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))
*/
Run Code Online (Sandbox Code Playgroud)

你的内存分配也是错误的.array是一个char**.你分配的内存*array本身就是一个char*.你永远不会为这个特定的指针分配内存,你错过了array[0] = malloc(n*sizeof(**array)):

array = malloc(sizeof(*array));
*array = malloc(n * sizeof(**array));
Run Code Online (Sandbox Code Playgroud)