我从Valgrind收到此错误:


== 31251 == Memcheck,内存错误检测器
== 31251 ==朱利安·塞沃德(Julian Seward)等人版权所有(C)2002-2010和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 ==通过0x400C4E:main(main.clean.cpp:50)
== 31251 ==
== 31251 ==
== 31251 ==堆摘要:
== 31251 ==在出口处使用:0字节,0块
== 31251 ==总堆使用量:2个分配,2个释放,3,010个字节分配
== 31251 ==
== 31251 ==释放了所有堆块-不可能泄漏
== 31251 ==
== 31251 ==对于检测到和抑制的错误的计数,请使用:-v重新运行
== 31251 ==使用--track-origins = 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++;
    }


}

最佳答案

是的@Adri C.S.在说:

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


做了:

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


注意:答案由@Adri C.S提供

关于c++ - Valgrind错误-条件跳转或移动取决于未初始化的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19816795/

10-12 03:02