相关疑难解决方法(0)

保证执行memcpy(0,0,0)是否安全?

我不太熟悉C标准,所以请耐心等待.

我想知道,按标准保证memcpy(0,0,0)是否安全.

我能找到的唯一限制是,如果内存区域重叠,那么行为是未定义的......

但我们可以认为这里的内存区域重叠吗?

c memcpy null-pointer language-lawyer

72
推荐指数
2
解决办法
2万
查看次数

memcpy,带有指向const数据的目标指针

我一直认为像const int *ameans 这样的语句aint指向const数据的指针,因此不应该修改它指向的值.事实上,如果你这样做const int a [] = {1,2,3},然后发出a[0] = 10你将得到编译器错误.

然而,令我惊讶的是,以下编译没有任何警告,运行得很好.

#include <stdio.h>
#include <string.h> 

int main (){

    const int a [] = {1, 1, 1};
    const int b [] = {2, 2, 2};

    memcpy((void*) &a[0], (const void*)&b[0], 3*sizeof(int));

    int i;
    for (i=0; i<3; i++) printf("%d\n",a[i]);

    return 0;
} 
Run Code Online (Sandbox Code Playgroud)

为什么允许这样做?这是由于演员吗?当我做memcpy(&a[0], (const void*)&b[0], 3*sizeof(int));编译时,及时生成以下警告:

cpy.c: In function ‘main’:
cpy.c:9:3: warning: passing argument 1 of ‘memcpy’ discards …
Run Code Online (Sandbox Code Playgroud)

c memory pointers

5
推荐指数
2
解决办法
5387
查看次数

标签 统计

c ×2

language-lawyer ×1

memcpy ×1

memory ×1

null-pointer ×1

pointers ×1