导致分段错误的memcpy

导致分段错误的memcpy,c,C,我目前在下面的函数中遇到了一个分段错误,我认为这可能是因为函数的目标类型是int,而源类型是double。但不完全确定,有人能帮忙吗 void main(int *x) { double y; memcpy(x, &y, sizeof(y)); } main第一个参数是argc,它是一个整数。由于它被解释为指向int的指针,x指向一些非法地址。当你尝试在那里写东西时,一些未定义的东西发生了。在你的情况下,是你的错 你可以试试这样的 #define MIN(x,y) (

我目前在下面的函数中遇到了一个分段错误,我认为这可能是因为函数的目标类型是int,而源类型是double。但不完全确定,有人能帮忙吗

void main(int *x)
{
    double y;
    memcpy(x, &y, sizeof(y));
}

main
第一个参数是
argc
,它是一个整数。由于它被解释为指向int的指针,
x
指向一些非法地址。当你尝试在那里写东西时,一些未定义的东西发生了。在你的情况下,是你的错

你可以试试这样的

#define MIN(x,y)  (((x) < (y)) ? (x) : (y))

void foo(int *x)
{
    double y;

    printf("%zu\n", MIN(sizeof(y), sizeof(*x)));
    memcpy(x, &y, MIN(sizeof(y), sizeof(*x)));
}

int main()
{
    int x;
    foo(&x);
}
定义最小值(x,y)((x)<(y))?(x):(y)) void foo(int*x) { 双y; printf(“%zu\n”,MIN(sizeof(y),sizeof(*x)); memcpy(x,&y,MIN(sizeof(y),sizeof(*x)); } int main() { int x; foo&x; }
只有
main
的两个有效签名是
int main(void)
int main(int argc,char**argv)
。此定义是未定义的行为。您的代码(实际上)试图取消对argc的引用,这导致了分段错误


我还想指出,在您的系统上,
double
很可能比
int
大。尝试使用
long-long
而不是
int

如果要获取double的整数值,请执行以下操作:

//在这里在线试用https://rextester.com/NIUA85155
#包括
void my_函数(int*x)
{
double y;//如果未初始化,它将被随机垃圾填充
y=123.456;
int temp_int=(int)y;//强制转换为int会降低分数
*x=temp_int;//将整数值存储在x指向的int中
}
内部主(空)
{
int my_int=0;
my_函数(&my_int);
printf(“你好,世界!%i\n”,我的int);
返回0;
}
如果出于某种原因需要使用memcpy,我建议您将它与
static\u assert()
一起使用,以捕获明显的问题,例如导致您出错的问题

//请在此处联机尝试:https://rextester.com/THV27155
//使用C11支持编译以使用静态断言
#包括
#包括
#包括
void my_函数(int*x)
{
双y=123.456;
memcpy(x,&y,sizeof(*x));//sizeof(*x)==sizeof(int)
static_断言(sizeof(*x)=sizeof(y),“这些大小不一样!我们为什么要复制内存?”;
}
内部主(空)
{
int my_int=0;
my_函数(&my_int);
printf(“你好,世界!%i\n”,我的int);
返回0;
}
产出:

In file included from source_file.c:3:0:
source_file.c: In function ‘my_function’:
source_file.c:10:5: error: static assertion failed: "These aren\'t the same size! Why are we mem copying?"
     static_assert(sizeof(*x) == sizeof(y), "These aren't the same size! Why are we mem copying?");
     ^

C中的
main
不能有该签名。它必须是
int-main(void)
int-main(int-argc,char*argv[])
double
可能比系统上的
int
大。下一次:对于以后的帖子,如果你知道问题可能是什么,请记录下你是否尝试解决/测试过这个理论。在这种情况下,检查是否传递一个double-In就足够了,或者检查sizeof(double)与sizeof(int)之间的关系应该可以让您了解问题所在。