C 即使在正确的强制转换之后,增加空指针时也需要左值

C 即使在正确的强制转换之后,增加空指针时也需要左值,c,lvalue,memset,C,Lvalue,Memset,我正在实现memset方法。下面是代码片段: void my_memset(void* ptr, int n, size_t size) { unsigned int i; for( i = 0; i < size; ++i, ++(char*)ptr ) *(char*)ptr = n; } 当我将ptr的类型从void*更改为int*时,它会 为什么它要求左值 void my_memset(void* ptr, int n, size_t s

我正在实现memset方法。下面是代码片段:

void my_memset(void* ptr, int n, size_t size)
{
    unsigned int i;

    for( i = 0; i < size; ++i, ++(char*)ptr )
            *(char*)ptr = n;
}
当我将ptr的类型从void*更改为int*时,它会

为什么它要求左值

void my_memset(void* ptr, int n, size_t size)
{
    char *cptr = (char *)ptr;
    char *limit = cptr + size;

    for(; cptr < limit; cptr++) {
        *cptr = n;
    }
}
你不能通过这样的施法增加,你不应该这样做


您不能通过这样的强制转换递增,您也不应该这样做。

类型强制转换的结果不是左值。说

float f = 3.14;
++((int)f);

这里我们将对一个int值应用++运算符,但是我们没有一个int变量来递增。所以在一般情况下,类型转换不能产生左值。

类型转换的结果不是左值。说

float f = 3.14;
++((int)f);

这里我们将对一个int值应用++运算符,但是我们没有一个int变量来递增。因此,在一般情况下,类型转换不能产生左值。

您不能产生左值的原因与您不能这样做的原因相同:

++someFunction();


强制转换是一个表达式,表达式的结果没有可写存储。

您不能这样做的原因与您不能这样做的原因相同:

++someFunction();

强制转换是一个表达式,表达式的结果没有可写存储