Valgrind错误 - 条件跳转或移动取决于未初始化的值

时间:2013-11-06 15:59:45

标签: c++ pointers valgrind

我从Valgrind那里得到这个错误:

  • == 31251 == Memcheck,内存错误检测器
  • == 31251 ==版权所有(C)2002-2010,以及Julian Seward等人的GNU GPL,
  • == 31251 ==使用Valgrind-3.6.0和LibVEX;重新运行-h获取版权信息
  • == 31251 ==命令:./ a.out
  • == 31251 ==父PID:31250
  • == 31251 ==
  • == 31251 ==条件跳转或移动取决于未初始化的值
  • == 31251 ==在0x400B9F:strcat2(char *,char *)(main.clean.cpp:30)
  • == 31251 == by 0x400C4E:main(main.clean.cpp:50)
  • == 31251 ==
  • == 31251 ==
  • == 31251 == HEAP SUMMARY:
  • == 31251 ==在退出时使用:0块中的0字节
  • == 31251 ==总堆使用量:2个分配,2个释放,3,010个字节分配
  • == 31251 ==
  • == 31251 ==所有堆块都被释放 - 没有泄漏可能
  • == 31251 ==
  • == 31251 ==对于检测到的和抑制的错误计数,请重新运行:-v
  • == 31251 ==使用--track-originins = yes查看未初始化值的来源
  • == 31251 ==错误摘要:来自1个上下文的3个错误(被抑制:6个来自6个)

我看不出我的代码有什么问题......

#include <iostream>
using namespace std;

void strcat2(char* a, char* b);

int main()
{
    char *a = new char[2010], *b = new char[1000];
    while (cin.getline(a, 1000) && cin.getline(b, 1000))
    {
        cout << "a = \"" << a << "\";" << endl;
        cout << "strcat2(a, \"" << b << "\");" << endl;
        strcat2(a, b);
        cout << "a = \"" << a << "\";" << endl << endl;
    }
    delete[] a;
    a = NULL;
    delete[] b;
    b = NULL;


    return 0;
}

void strcat2(char* a, char* b){
    while (*a){ 
        a++; 
    }
    while((*a++ = *b++) != '\0'){ 
        *a++ = *b++;
    }


}

1 个答案:

答案 0 :(得分:1)

是的,正如@Adri C.S.所说:

while((*a++ = *b++) != '\0') { 
    *a++ = *b++;
}

制作:

while((*a++ = *b++) != '\0');

注意:答案由@Adri C.S

给出