【问题标题】:Passing a pointer to an int array to a c-function将指向 int 数组的指针传递给 c 函数
【发布时间】:2011-01-31 09:34:52
【问题描述】:

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

这个调用有什么问题?

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] 所有小写字符都转换为大写 在比较之前。禁用 此功能意味着较低
case string "code" 不会 识别为与上层相同 大小写字符串“代码”。此外,该 相似字符的调整 部分仅适用于大写 人物。 对于字符串,建议的值全为零,例如 名字。 */

【问题讨论】:

  • 你是说这不能在别处编译吗?即这是特定于 xcode 的?
  • 我不知道,这就是我添加标签的原因。可能是 XCode 中缺少某些东西。
  • 谢谢你们,伙计们,所有的好答案。 :)

标签: c arrays xcode function pointers


【解决方案1】:

params 是一个int [2],当传递给函数时会衰减为int *,而将int []s 作为参数的函数实际上是在幕后使用int *s。不幸的是,&params 是一个int(*)[2],它比你需要的int ** 更接近int *(与函数参数中的int *[] 相同)。

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

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

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

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

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

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

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

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

【讨论】:

  • 不,&paramsparams 不同。他们持有的地址相同,但&params 的类型为int (*)[2]
  • 我选择了 int (*ind_c)[2]。该函数只会被我自己调用,而且只会在一个地方调用。那永远不会改变。因此,在这种情况下,该选项似乎非常安全。
  • @Jens - 当你在说“我今晚要早点睡觉并在合理的时间起床”之后熬夜到凌晨 5 点时,就会发生这种情况。修复。
  • @Joseph - 如果你只在一个地方调用它并且有这样特定的数组要求,为什么它是一个单独的函数?
  • 这是一个写于 1994 年的函数。不是我自己写的。我只是在使用它。 :)
【解决方案2】:

strcmp95 接受一个指向 int 指针 (int **) 的指针,而您将一个指向两个 int 数组的指针 (int (*)[2]) 传递给它。

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

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

这里的重点是指向数组的指针(int (*x)[])与指针数组(即int *(x[]),与int *x[]相同)不同

【讨论】:

  • 嗯...好吧。我会试着弄清楚如何改变它。 :) 这两种方法的优点/缺点是什么?
  • @Joseph Tura:我更新了答案。 int *x[] 是一个指针数组,而您正在传递一个指向数组的指针。
【解决方案3】:

很难知道 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[])

【讨论】:

    【解决方案4】:

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

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

    其次,strcmp95 现在应该期待一个整数数组,这很好:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 2017-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-23
        • 2021-08-20
        • 1970-01-01
        相关资源
        最近更新 更多