C 将#define传递给void*函数

C 将#define传递给void*函数,c,C,我试图将一个#define宏传递给一个采用void*参数的函数 但我有一些分割错误,所以我认为我做错了什么;十, 我不明白我做错了什么 以下是我为理解问题而编写的简单代码: #include <stdio.h> #include <stdlib.h> #define TEST 0xFFFFu void f(void *test) { printf("%d\n", *(int*)test); } int main() { int

我试图将一个#define宏传递给一个采用void*参数的函数

但我有一些分割错误,所以我认为我做错了什么;十,

我不明白我做错了什么

以下是我为理解问题而编写的简单代码:

#include <stdio.h>
#include <stdlib.h>


#define TEST 0xFFFFu

void f(void *test)
{
    printf("%d\n", *(int*)test);
}

int main()
{
    int b = 5;

    f((int*)TEST);

    return 0;
}
#包括
#包括
#定义测试0xFFFFu
空隙f(空隙*试验)
{
printf(“%d\n”,*(int*)测试);
}
int main()
{
int b=5;
f((int*)试验);
返回0;
}

谢谢。

分段错误可能与使用
\define
无关。您使用
0xFFFFu
调用函数,这是您的程序可能不拥有的地址,当您尝试使用
*
操作符取消对它的引用时,您会跳出段,并得到一个段错误。

此代码在C语言中是有效的。请注意,“传递a#define”是胡说八道,a#define只是一个预处理器关键字,在本例中扩展为整数常量

因此,您的代码实际要做的是将整型常量0xFFFF转换为指针,然后尝试将该指针反引用到访问地址0xFFFF


我们可以将整数转换为指针或其他方式,但这可能会在某些系统上导致访问不对齐或指令陷阱。当然,地址必须是有效的。显然,您的特定系统对从地址0xFFFF及其以外访问
int
值不感兴趣。

您的程序取消引用一个(看似)任意内存地址,除了会发生什么?指针是内存地址,当您取消引用指针时,您从该地址读取。您希望能够从地址0xFFFF读取什么内容?请不要对使现有答案无效的问题进行更改。我已经回滚了你的问题。好的,谢谢你,现在我要做的是在我取消引用变量void*测试时,在其中加入0xFFFF。我可以在C中进行测试吗?或者这是不可能的?Re“在变量void*test中”:
void*test
不是一个变量。带有一个
,它将是一个声明。如果您将其作为引用变量
test
的简写,同时表示其类型为
void*
,则在取消引用时不能使用0xFFFF,因为0xFFFF不是执行程序内存中的有效地址。将其与其中的该值解除引用将导致分段错误。如果希望
*test
中包含0xFFFF,那么一种方法是创建一个包含0xFFFF的对象,并将
test
设置为指向该对象,如
unsigned x=0xFFFFu;无效*测试=&x