4

我有以下代码:

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:在函数'main'中:
temp.c:6:5:警告:函数“malloc”的隐式声明 [-Wimplicit-function-declaration]
temp.c:6:13:警告:内置函数“malloc”的隐式声明不兼容 [默认启用]
temp.c:10:5:警告:函数“测试”的隐式声明 [-Wimplicit-function-declaration]
temp.c:在顶层:
temp.c:15:5:错误:“测试”的类型冲突
temp.c:15:1:注意:具有默认提升的参数类型不能匹配空参数名称列表声明
temp.c:10:5:注意:先前的“测试”隐式声明在这里
temp.c:在函数“测试”中:
temp.c:16:5:警告:函数“strcmp”的隐式声明 [-Wimplicit-function-declaration]

我试图了解问题所在。

4

4 回答 4

7

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

temp.c:在函数“测试”中:
temp.c:20:5: 警告:传递 'strcmp' 的参数 1 使指针从整数而不进行强制转换 [默认启用]
/usr/include/string.h:143:12:注意:预期为 'const char *' 但参数的类型为 '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包含空字节,则调用test将导致分段错误:

[1] 14940 分段错误(核心转储)./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))
*/

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

array = malloc(sizeof(*array));
*array = malloc(n * sizeof(**array));
于 2012-07-31T08:19:59.843 回答
3

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

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

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

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

before main,或者只是将整个定义(函数)移到 before main

此外,不要忘记和标头,以便和#include的原型也可用。string.hstdlib.hstrcmpmalloc

于 2012-07-31T08:16:24.947 回答
3

错误 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)
于 2012-07-31T08:12:34.543 回答
1

当您将 char 数组传递给函数时,参数衰减为指针。将您的函数参数更改为

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

你的代码至少应该编译

于 2012-07-31T08:12:43.500 回答