gpt4 book ai didi

c - 为什么传递数组通用指针不起作用

转载 作者:行者123 更新时间:2023-11-30 20:52:34 25 4
gpt4 key购买 nike

#include<stdio.h>
#include<stdlib.h>
#define N 5
typedef enum { FALSE, TRUE } BOOL;
BOOL Int_Sum(void*, void*, void*);
BOOL Sum(BOOL(*f)(void*, void*, void*), void* p_num, void* number) {
int i, j;
for (i = 0; i < N; i++) {
for (j = 1; j < N; j++) {
if (f(p_num+i, p_num+j, number))
return TRUE;
}
}
return FALSE;
}

int main()
{
int num[] = { 3,5,23,5,6 }, i, value;

if (Sum(Int_Sum, num, 5) == TRUE)
printf("There is such sum\n");
else
printf("There is no such sum\n");

getch();
return 0;
}

BOOL Int_Sum(void* a, void* b, void* c)
{
if (*(int*)a + *(int*)b == *(int*)c)
return TRUE;
return FALSE;
}

它仅在我使用 void** 时有效,有人可以向我解释一下吗?我认为这并不重要,因为我传递了数组中第一个元素的地址?

编辑:原来的代码是这样的,它可以工作,上面的代码我改变了,所以我可以测试一下,但下面的代码我仍然不完全

   typedef  enum { FALSE, TRUE } BOOL;
BOOL Int_Sum(void*, void*, void*);
BOOL Sum(BOOL(*f)(void*, void*, void*), void** p_num, void* number) {
int i,j;
for (i = 0; i < N; i++) {
for (j = 1; j < N; j++) {
if(f(p_num[i], p_num[j], number))//f is int_sum
return TRUE;
}
}
return FALSE;
}

int main()
{
int num[] = { 3,5,23,5,6 }, i, value;
void* p_num[N];

for (i = 0; i < N; i++)
p_num[i] = &num[i];
printf("\nPlease enter an integer number ");
scanf("%d", &value);
if (Sum(Int_Sum, num, &value) == TRUE)
printf("There is such sum\n");
else
printf("There is no such sum\n");

最佳答案

那里有很多问题 - 最重要的是:

  1. 空指针算术。它不可移植,因为它是 gcc 扩展。它适用于 char 大小,而不适用于任何其他类型大小。所以你需要自己计算一下。
  2. Sum(Int_Sum, num, 5) - 您不传递数字 5,而是将 5 转换为指针。然后这个指针被取消引用——它是一个 UB。您需要一个单独的变量,并将引用传递给该变量

https://godbolt.org/z/3Ju9e4



#define N 5

typedef enum { FALSE, TRUE } BOOL;

BOOL Int_Sum(void*, void*, void*);

BOOL Sum(BOOL(*f)(void*, void*, void*), void* p_num, void* number, size_t size) {
int i, j;
for (i = 0; i < N; i++) {
for (j = 1; j < N; j++) {
if (f(((char *)p_num) + i * size, ((char *)p_num) + j * size, number))
return TRUE;
}
}
return FALSE;
}

int main()
{
int num[] = { 3,5,23,5,6 }, i, value;
int anothernum = 5;

if (Sum(Int_Sum, num, &anothernum, sizeof(num[0])) == TRUE)
printf("There is such sum\n");
else
printf("There is no such sum\n");

return 0;
}

BOOL Int_Sum(void* a, void* b, void* c)
{
if (*(int*)a + *(int*)b == *(int*)c)
return TRUE;
return FALSE;
}

关于c - 为什么传递数组通用指针不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60113805/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com