将指向int数组的指针传递给c函数

时间:2011-01-31 09:34:52

标签: c arrays xcode function pointers

我有一个非常基本的问题。

这次电话有什么问题?

int params[2] = {1, 1};
return strcmp95((char*)buffer1, (char*)buffer2, (long)stringLength, &params);

该功能的定义如下:

double  strcmp95(char *ying, char *yang, long y_length, int *ind_c[])

{...

当我在XCode中编译时,我收到以下警告:

  

警告:传递参数4   来自不兼容指针的'strcmp95'   型

抱歉不精确。这是功能描述:

  

/ *参数:          ying和yang是指向要比较的2个字符串的指针。字符串      不必是NUL终止的字符串   因为长度通过了。          y_length是字符串的长度。          ind_c是一个数组,用于定义某些选项是否应该   被激活。非零值   表示该选项已停用      选项是:        ind_c [0]匹配时增加匹配概率      字符很大。这个选项   允许更多的容忍度   当字符串很大时。它不是   比较时的适当测试   固定长度的字段,如电话和      社会安全号码。        ind_c [1]所有小写字符都转换为大写   在比较之前。禁用   这个功能意味着下层
  案例字符串“代码”不会   被认为与鞋面相同   案例字符串“CODE”。而且,   调整类似的字符   部分仅适用于大写   字符。          建议的值对于字符串都是零,例如   名。 * /

5 个答案:

答案 0 :(得分:4)

paramsint [2],在传递给函数时会衰减到int *,并且以int []为参数的函数实际上正在int *在幕后。不幸的是,&paramsint(*)[2],比您需要的int *(与函数参数中的int **相同)更接近int *[]

您最好的选择是将您的功能更改为:

double  strcmp95(char *ying, char *yang, long y_length, int *ind_c)

并假设调用者将始终通过int[2]。或者您可以明确要求int(*)[2] - 指向2 int s数组的指针:

double  strcmp95(char *ying, char *yang, long y_length, int (*ind_c)[2])

但这似乎没有必要保证传递两个int,如果你需要考虑数组中两个以上int s的可能性是不合适的。更好的方法是:

double  strcmp95(char *ying, char *yang, long y_length, int *ind_c, size_t len)

size_t是一个无符号整数类型,保证能够保存任何对象或任何数组索引的大小,在这种情况下,len参数是数组的长度({{1如果你想要花哨/前瞻性思考,(sizeof params / sizeof params[0])如果你不这样做。那是最安全的路线。

顺便说一句,您的2参数也应该是y_length变量。 size_t已签名,我不得不处理一个-1长度的字符串。即使您使用long,也无法保证unsigned long足以处理系统的大小(相反,对于您的系统来说,一个错误的大long值太大了处理并导致混淆)。

答案 1 :(得分:2)

strcmp95获取指向int(int **)的指针,同时向它传递一个指向两个整数(int (*)[2])数组的指针。

您可以修改strcmp95,使其签名如下所示:

double  strcmp95(char *ying, char *yang, long y_length, int (*ind_c)[] );

这里的要点是指向数组(int (*x)[])的指针与指针数组(int *(x[])并且与int *x[]相同)

答案 2 :(得分:1)

很难知道strcmp95是否应该采用像你试图传递的int数组,或者它是要将一个int指针数组作为原型请求。前者似乎很可能 - 如果是这样,你应该改变......

double  strcmp95(char *ying, char *yang, long y_length, int *ind_c[])

...到...

double  strcmp95(char *ying, char *yang, long y_length, int *ind_c)

......或等同于......

double  strcmp95(char *ying, char *yang, long y_length, int ind_c[])

答案 3 :(得分:1)

为什么你传递& params,params就足够了,因为数组就像一个指针。

return strcmp95((char*)buffer1, (char*)buffer2, (long)stringLength, params);

其次strcmp95现在应该期待一系列的整数,这很好:

double  strcmp95(char *ying, char *yang, long y_length, int ind_c[])

答案 4 :(得分:1)

另外我认为你正在传递params(它本身就是一个整数指针),而strncmp95函数期望指向一个整数数组的指针,即int * ind_c []。