2016-05-30 4 views
0

Это мой код. Этот код может работать хорошо. Но когда я удаляю «endl» в «cout < <« Привет мир! »< < endl;", он не может работать. This is what I get when delete endlпосле удаления endl in cout << "hello" << endl, моя программа на C++ перестала работать

#include <iostream> 
#include <cstring> 

using namespace std; 
int main() 
{ 
    char * name; 
    char * n = "aaaa"; 
    strcpy(name, n); 
    cout << name; 
    cout << "Hello world!" << endl; 
    return 0; 
} 

Ниже приведен код, который удален Endl.

#include <iostream> 
#include <cstring> 

using namespace std; 
int main() 
{ 
    char * name; 
    char * n = "aaaa"; 
    strcpy(name, n); 
    cout << name; 
    cout << "Hello world!"; 
    return 0; 
} 
+3

Пожалуйста, копировать/вставить сообщение об ошибке внутри вашего поста, а не давать ссылку на картинку – Garf365

+0

Может прочитать [ 'strcpy' ССЫЛКА] (Http: //en.cppreference .com/б/с/строки/байт/зЬгсру)? – juanchopanza

ответ

8

Давайте посмотрим на эти строки:

char * name; 
char * n = "aaaa"; 
strcpy(name, n); 

Переменная name не инициализирован. Это содержимое неопределенно и будет казаться случайным. Использование его в качестве адресата для вызова strcpy приведет к неопределенного поведения.

Если вы хотите использовать строки C-стиле, вам нужно выделить память для name, например, с помощью массива:

char name[128]; 

Но если вы на самом деле программирования на C++, почему дон Вы используете классные классы, которые поставляются со стандартной библиотекой? Например, std::string класс, который очень хорошо обработки строк:

#include <string> 
#include <iostream> 

int main() 
{ 
    std::string name; 
    std::string n = "aaaa"; 

    name = n; 

    std::cout << name << '\n'; 
    std::cout << "Hello world" << std::endl; 
} 
0

Вы копируя в адрес мусора.

char * name; //<<<garbage address 
char * n = "aaaa"; 
strcpy(name, n); 
2

name является неинициализированным указатель: он указывает на каком-то случайном месте памяти. Когда вы найдете strcpy, вы попираете пять байтов в этом месте, заменяя их aaaa\0.

Формально это неопределенное поведение. На практике вы стали свидетелями двух разных симптомов: никакого видимого эффекта и краха.

Точка name при достаточно большом буфере, который у вас есть на самом деле, и все будет хорошо.

1


char * name;
Эта строка 'name' не инициализируется и содержит мусор.
Вместо сделать что-то вроде:

using namespace std; 
int main(){ 

    char name[10]; 
    char *n = "aaaa"; 
    strcpy(name, n); 
    cout << name; 
    cout << "Hello world!"; 

    return 0; 
} 
Смежные вопросы