2013-11-17 3 views
-1

Я пробовал использовать malloc и new, но в любом случае я получаю размер массива до 24. Что происходит?Как правильно назначить память динамическому массиву символов

//I want to copy the last nine characters to a new string 
//the function is basically for copying last x number of characters to a new string. 

int main() 
{ 
    char str[] = "1234567890"; 

    int offset=1; 
    int j=offset; 
    int len=strlen(str); 
    cout<<len-offset<<endl; 

    char str[] = "1234567890"; 
    char* s=new char[9]; 


    for(int i=0;j<len;i++){ 
     s[i]=str[j]; 
     j++; 
    } 
cout<<strlen(s); 
return 0; 
} 

Теперь я предполагаю, что выделенная память находится в байтах. но тогда я назначаю 9 байтов, почему он показывается как 24?

+0

где он показывает 24? – Adam

+0

Возможно, потому, что вы уходите от конца выделенного массива (размер 9) при переходе по более крупной строке (длина 10), * и * вы не завершаете свою строку нулевым символом независимо (требование для 'strlen()' функционировать должным образом). У вас есть неопределенное поведение в нескольких местах, и, честно говоря, вам (не) повезло, что он не разбился. Наконец, это даже не * компилируемый * код, так как 'str' объявляется * дважды * в той же области. – WhozCraig

+0

Повторная декларация является ошибкой при отправке кода. –

ответ

1

Я прокомментировал ваш код ниже, чтобы показать, что происходит. У вас ситуация с переполнением буфера, потому что вы переписываете больше памяти, чем вы выделили для s. Это вызывает неопределенное поведение. Если вы не знакомы с тем, что такое переполнение буфера, обязательно проверьте this post. Вы будете гораздо лучшим программистом для его чтения.

//I want to copy the last nine characters to a new string 
//the function is basically for copying last x number of characters to a new string. 

int main() 
{ 
    char str[] = "1234567890"; 

    int offset=1; 
    int j=offset; 
    int len=strlen(str); // len == 10 
    cout<<len-offset<<endl; 

    char str[] = "1234567890"; 
    char* s=new char[9]; // s has room for 9 bytes 


    for(int i=0;j<len;i++){ // len == 10 
     s[i]=str[j]; 
     j++; 
    } 
    // You've now written past the end of the memory allocated for s. 
    // Welcome to undefined behavior land 
cout<<strlen(s); 
return 0; 
} 
Смежные вопросы