2013-04-28 1 views
-2

У меня есть этот код, но не могу найти источник ошибки. Я хотел бы хранить несколько имен в массиве char, и мне нужно использовать тип char. Я сделал это, но с этим что-то не так.Почему возникает ошибка? (C)

#include <iostream> 
#define MAX 2 
using namespace std; 

int main() 
{ 

    char **names; 
    names=new char* [MAX]; 
    names[0]=new char[3]; 

    for(int i=0;i<3;i++) 
     names[0][i]='a'; 

    names[1]=new char[4]; 
    cout<<names[0]<<endl; 
    for(int i=0;i<4;i++) 
     names[1][i]='b'; 

    cout<<names[1]<<endl; 
    //////////////// 
    for(int i=0;i<MAX;i++) 
     delete names[i]; 
    delete [] names; 
    return 0; 
} 

Может кто-нибудь объяснить, почему, я получаю ошибки в valgrind? Нет утечки, но есть ошибка.

Invalid read of size 1 
==4063== at 0x4C2BFB4: strlen (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==4063== by 0x4EC62E0: std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16) 
==4063== by 0x400911: main (main.cpp:16) 
==4063== Address 0x5a03093 is 0 bytes after a block of size 3 alloc'd 
==4063== at 0x4C2AC27: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==4063== by 0x4008B4: main (main.cpp:10) 
==4063== 
aaa 
==4063== Invalid read of size 1 
==4063== at 0x4C2BFB4: strlen (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==4063== by 0x4EC62E0: std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16) 
==4063== by 0x400964: main (main.cpp:20) 
==4063== Address 0x5a030e4 is 0 bytes after a block of size 4 alloc'd 
==4063== at 0x4C2AC27: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==4063== by 0x4008FA: main (main.cpp:15) 
==4063== 
bbbb 
==4063== Mismatched free()/delete/delete [] 
==4063== at 0x4C2A4BC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==4063== by 0x400992: main (main.cpp:23) 
==4063== Address 0x5a03090 is 0 bytes inside a block of size 3 alloc'd 
==4063== at 0x4C2AC27: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==4063== by 0x4008B4: main (main.cpp:10) 
+1

Потому что вы не завершаете нуль строк. – WhozCraig

ответ

2

Вы забыли о null terminator в вашем C-string

names[0] = new char[4]; // 3 + 1 because of the null terminator 

for(int i = 0; i < 3; i++) 
    names[0][i] = 'a'; 

names[0][3] = '\0'; 

Так, по существу, при выводе строки с использованием std::cout <<, Valgrind сообщает недопустимый доступ к памяти, поскольку выходная рутина не понимает, где C-строка заканчивается и просто продолжает выводить символы за буфер памяти, выделенный для строки.

Кроме того, я предполагаю, что это домашнее задание или что-то в этом роде, иначе вы были бы безумны, чтобы не использовать std::string.

+0

+1 Там я пошел. = P Одна из причин, по которой я всегда использую '0', и пусть компилятор поступает правильно. – WhozCraig

+0

, что, была проблема, и я также забыл [] в 'delete [] names [i];' – user2096865

 Смежные вопросы

  • Нет связанных вопросов^_^