使用memcpy丢弃限定符

han*_*nno 2 c c99

为什么以下代码会给我一个"丢弃限定符"警告?

double* const a[7];
memcpy(a,b,sizeof(double*)*7);
Run Code Online (Sandbox Code Playgroud)

我使用Apple LLVM版本6.1.0(clang-602.0.53)(基于LLVM 3.6.0svn)获得的错误是

warning: passing 'double *const [7]' to parameter of type 'void *' discards qualifiers
Run Code Online (Sandbox Code Playgroud)

编辑:

奖金问题.为什么restrict关键字也不起作用?

double* restrict a[7];
memcpy(a,b,sizeof(double*)*7);
Run Code Online (Sandbox Code Playgroud)

编辑2:

我问这个问题,因为我想a成为一个const restrict指针.我可以使用以下代码获得此结果:

double* const restrict a[7] = {b[0], b[2], ... b[7]};
Run Code Online (Sandbox Code Playgroud)

这是一件愚蠢的事吗?

dbu*_*ush 5

您正在尝试将const指针传递给期望非const指针的函数.

编辑:

更具体地说,a是一个数组,其内容是const指向双精度的指针.如果您尝试这样做a[0] = b[0](假设b被定义为double *b[7]或类似的东西),您将收到编译器错误.如果您有const char a[7]并且尝试过,结果将是相同的a[0] = 'x'.

memcpy按照您的方式呼叫可以有效地执行上面禁止操作的操作.

在这种情况下restrict,它告诉编译器给定指针指向的内存只能由给定的指针寻址.这允许编译器执行某些优化.

来自维基百科:

它表示在指针的生命周期中,只有它或直接从它派生的值(例如指针+ 1)才能用于访问它指向的对象.

因为memcpy不期望restrict *失去保证,这就是你得到警告的原因.通常,绕过restrict这样会导致不可预测的行为.

  • 这并没有真正回答这个问题,而是重新编写错误信息. (3认同)