小编Wil*_*ill的帖子

void指针作为参数

以下C片段:

[...] 
void f1(void* a){
  printf("f(a) address = %p \n",a);
  a = (void*)(int*)malloc(sizeof(int));

  printf("a address = %p \n",a);
  *(int*)a = 3;

  printf("data = %d\n",*(int*)a);
}

void f(void){
  void* a1=NULL;
  printf("a1 address = %p \n",a1);

  f1(a1);

  printf("a1 address = %p \n",a1);
  printf("Data.a1 = %d\n",*(int*)a1);
}
[...]
Run Code Online (Sandbox Code Playgroud)

结果是

a1 address = (nil) 
f(a) address = (nil) 
a address = 0xb3f010 
data = 3
a1 address = (nil) 
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)

为什么不在a1函数中保留已分配给它的地址?

c pointers arguments void-pointers argument-passing

7
推荐指数
3
解决办法
3万
查看次数

如何确保不同系统上的浮点数相同?

如果我在Windows和Linux(ubuntu)上编译以下c行,我会得到不同的结果.我想避免.我该怎么做?

 double a = DBL_EPSILON;
 double b = sqrt(a);
 printf("eps = %.20e\tsqrt(eps) = %.20e\n", a, b);
Run Code Online (Sandbox Code Playgroud)

linux输出:

eps = 2.22044604925031308085e-16        sqrt(eps) = 1.49011611938476562500e-08
Run Code Online (Sandbox Code Playgroud)

窗口输出:

eps = 2.22044604925031310000e-016       sqrt(eps) = 1.49011611938476560000e-008
Run Code Online (Sandbox Code Playgroud)

在linux上测试用gcc和clang在32位和64位系统上的结果相同.在使用32位的gcc-mingw和32位和64位的visual-studio测试的Windows上,也有相同的结果.

c floating-point platform-independent

7
推荐指数
1
解决办法
2232
查看次数