C - 如果声明为 int*,函数中的参数无法处理 int

标签 c parameter-passing

我想以两种不同的方式使用名为 is_subsetOf() 的 C 函数:

方式 1:int* a 和 int* b 是大小 >=2 的数组。 方式二:int* a 的大小 >=2,但 int* b 的大小仅为 1,这意味着 b 是一个 int。

如何强制 C 接受 int* b 的大小为 1 的情况?或者这在 C 中是不可能的? int 是一个大小为 1 的数组?

int* is_in(int *left_hand, int n_l, int *right_hand, int n_r) {
  int *get_bool;
  get_bool = malloc(sizeof(int)*n_l);

  for (int i=0; i<n_l; i++) {
    if (is_subsetOf(right_hand, n_r, *(left_hand+i), 1)) {
      *(get_bool+i) = 1;
    }
  }
  return (get_bool);
}

int desc(const void *a, const void *b) {
  return (*(int*)a - *(int*)b);
}

int is_subsetOf(int *a, int n_a, int *b, int n_b) {
  qsort(a, n_a, sizeof(int), desc);
  qsort(b, n_b, sizeof(int), desc);
  int v = includes(a, n_a, b, n_b);
  return(v);
}

这是我从编译器收到的消息。我知道这只是一个警告,但我希望一切都是干净的。

tmp.c: In function ‘is_in’:
tmp.c:73:47: warning: passing argument 3 of ‘is_subsetOf’ makes pointer 
from integer without a cast [-Wint-conversion]
     if (is_subsetOf(right_hand, n_r, *(left_hand+i), 1)) {
                                  ~~~~~~~~~^~~
tmp.c:37:39: note: expected ‘int *’ but argument is of type ‘int’
 int is_subsetOf(int *a, int n_a, int *b, int n_b) {

最佳答案

int* a and int* b are arrays with sizes >=2.

不,它们是指针并且没有任何大小。您可能的意思是通过它们传递数组,但它们不是数组。知道这是有区别的。

An int IS an array of size 1

不,int a[1]; 是一个大小为 1 的数组; int a; 只是 int。但是数组可以衰减为指向其第一个元素的指针,并且变量具有地址,因此这是正确的:

int a[1];
int b;
int* ptr1 = a;//Points to the a[0]
int* ptr2 = &b;

两者现在是相同的类型并且可以以相同的方式使用。当然,您不知道 int 后面是否有内存中的任何其他整数,这种检查取决于程序员(通常通过像您一样传递长度参数)。以下是您实际要查找的代码:

is_subsetOf(right_hand, n_r, left_hand+i, 1)

指针可以递增,left_hand+i将指向int之后的第i个int,其中left_hand 当前指向。同样,此类指针的有效性取决于程序员。

编译器警告在这里非常重要,因为 *(left_hand+i)int 类型,编译器警告它将把 is 视为 int *。本质上是将 int 的值视为内存地址。这根本不是您想要的,它错误

关于C - 如果声明为 int*,函数中的参数无法处理 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52768645/

相关文章:

r - 使用 dplyr/ggplot 将变量之间的交互传递给函数

powershell - 从 PowerShell 脚本调用 Windows 可执行文件,传递所有参数

c - 使用套接字从客户端读取

c - 简单 C 子/父程序中的意外终止

java - 使用参数行 Java 打开快捷方式 (.lnk)

javascript - 如何按值将对象传递给 nodejs/javascript 中的函数?

python - 将参数(目录)传递给 ipython 笔记本中的 %cd 命令

c - 如何用C实现曲线的自适应 segmentation 算法

C++ - 无符号整数的模

c++ - 如何将 void* 转换为 foo* 以符合 C++?