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