0

我从 Valgrind 收到此错误:

  • ==31251== Memcheck,内存错误检测器
  • ==31251== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
  • ==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== 堆摘要:
  • ==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++;
    }


}
4

1 回答 1

1

是的,正如@Adri CS 所说:

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

做了:

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

注:答案由@Adri CS 给出

于 2013-11-06T16:12:17.920 回答