即使在正确投射之后,也需要增加空指针所需的左值

时间:2012-08-20 11:35:59

标签: 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;
}

我得到的是error

prog.cpp: In function ‘void my_memset(void*, int, size_t)’:
prog.cpp:8: error: lvalue required as increment operand

当我将ptr的类型从void*更改为int*时,它compiles successfully

为什么要求左值?

3 个答案:

答案 0 :(得分:4)

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

    for(; cptr < limit; cptr++) {
        *cptr = n;
    }
}

你不能通过这样的演员来增加,你不应该这样做。

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:0)

出于同样的原因,你不能这样做:

++someFunction();

 ++(a + b);

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