我想以两种不同的方式使用名为 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/