c++ 出现error: lvalue required as left operand of assignment

hashcat 2015-09-19 09:04:08
出问题的代码如下

for (pp = addlp, ppend = addlp + addlsize; pp < ppend; (long*)pp += 16){

没太明白是咋回事,大家能说说怎么改吗???
...全文
16074 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
二班的码农 2015-09-20
  • 打赏
  • 举报
回复
就是个警告,意思说,这个强制转换有风险,long *temp = addlp改成 long *temp = (long*)addlp
hashcat 2015-09-20
  • 打赏
  • 举报
回复
引用 9 楼 ant2012 的回复:
[quote=引用 7 楼 hashcat 的回复:] [quote=引用 3 楼 ant2012 的回复:] 楼主,你一定要转换成long型指针 ,可以再开辟一个long型指针来承接其它指针强制转换来的地址
那样的话,承接的地方不也会出这个左值转换的报错吗?[/quote] 不会的 将代码改成这样 for (long *temp = addlp, ppend = addlp + addlsize; temp < ppend; temp += 16)[/quote] 我这么改完了以后告诉我一个什么c99标准的报错,然后我把long *temp = addlp, 改成了temp = addlp,,又在前面加了个long* temp; 之后报出两个警告, |warning: assignment from incompatible pointer type [enabled by default]| 和 |warning: comparison of distinct pointer types lacks a cast [enabled by default]| 这个怎么办啊?? 以下是整个这部分的代码。

extern char* FileMD5(const char* file, char* md5){
    /*
    计算文件MD5
    参数说明:
    file        文件路径字符串指针
    md5         用于保存MD5的字符串指针
    返回值为参数md5
    */

    FILE* fh;
    char* addlp;
    long* temp;
    long addlsize, j, M[16], abcdtmp[4], A, B, C, D, a, b, c, d;
    long long length, i, cpys;
    void *pp, *ppend;

    fh = fopen(file, "rb");
    fseek(fh, 0, SEEK_END);
    length = _ftelli64(fh);
    a = A = 0x67452301, b = B = 0xEFCDAB89, c = C = 0x98BADCFE, d = D = 0x10325476;
    addlsize = (56 - length % 64 > 0) ? (64) : (128);
    if (!(addlp = (char*)malloc(addlsize))) return 0;
    cpys = ((length - (56 - length % 64)) > 0) ? (length - length % 64) : (0);
    j = (long)(length - cpys);
    fseek(fh, -j, SEEK_END);
    fread(addlp, 1, j, fh);
    for (addlp[j++] = 128; j < addlsize; addlp[j++] = 0);
    pp = addlp + addlsize - 8;
    *((long long *)pp) = length << 3;
    for (rewind(fh); 16 == fread(M, 4, 16, fh);)
        MD5main

    for (temp = addlp, ppend = addlp + addlsize; temp < ppend; temp += 16) {
        for (i = 0; i < 16; M[i] = ((long*)temp)[i], i++);
        MD5main
    }
    free(addlp);fclose(fh);
    abcdtmp[0] = a, abcdtmp[1] = b, abcdtmp[2] = c, abcdtmp[3] = d;
    for (addlp = (char*)abcdtmp, i = 0; i < 16; sprintf((md5 + 2 * i), "%02X", (unsigned char)addlp[i]), i++);
    return md5;
}
二班的码农 2015-09-20
  • 打赏
  • 举报
回复
引用 7 楼 hashcat 的回复:
[quote=引用 3 楼 ant2012 的回复:] 楼主,你一定要转换成long型指针 ,可以再开辟一个long型指针来承接其它指针强制转换来的地址
那样的话,承接的地方不也会出这个左值转换的报错吗?[/quote] 不会的 将代码改成这样 for (long *temp = addlp, ppend = addlp + addlsize; temp < ppend; temp += 16)
hashcat 2015-09-20
  • 打赏
  • 举报
回复
引用 11 楼 ant2012 的回复:
就是个警告,意思说,这个强制转换有风险,long *temp = addlp改成 long *temp = (long*)addlp
哦哦哦,明白了,改完以后已经不报警告了,谢谢啦~
ri_aje 2015-09-20
  • 打赏
  • 举报
回复
代码上全了,最起码涉及的几个变量类型得说清楚了。
hashcat 2015-09-19
  • 打赏
  • 举报
回复
引用 3 楼 ant2012 的回复:
楼主,你一定要转换成long型指针 ,可以再开辟一个long型指针来承接其它指针强制转换来的地址
那样的话,承接的地方不也会出这个左值转换的报错吗?
hashcat 2015-09-19
  • 打赏
  • 举报
回复
引用 1 楼 ant2012 的回复:
意思是左值不能强制转换
额...那应该怎么修改啊??
hashcat 2015-09-19
  • 打赏
  • 举报
回复
引用 2 楼 iyomumx 的回复:
表达式 (long*)pp 给出一个右值,但 += 运算符要求左操作数为左值
额...那应该怎么改啊...
yshuise 2015-09-19
  • 打赏
  • 举报
回复
大概是构建一个链表,写内存池常用的方法。
二班的码农 2015-09-19
  • 打赏
  • 举报
回复
楼主,你一定要转换成long型指针 ,可以再开辟一个long型指针来承接其它指针强制转换来的地址
iyomumx 2015-09-19
  • 打赏
  • 举报
回复
表达式 (long*)pp 给出一个右值,但 += 运算符要求左操作数为左值
二班的码农 2015-09-19
  • 打赏
  • 举报
回复
意思是左值不能强制转换

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧