2015-11-12 2 views
1

У меня есть следующий код, интересно, в чем разница между реализацией str2 и str3, они оба дают те же результаты, которые более подвержены ошибкам? EDIT: когда я тестировал представление str2, я обнаружил, что один раз мой код разбился, потому что str2 был плохим указателем!разница между char [] и char * при выполнении strcpy

/* strcpy example */ 
#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char str1[] = "Sample string"; 
    char str0[] = "Sample String and more"; 
    char* str2; 
    str2 = new char[40]; 
    char str3[40]; 
    strcpy (str2,str1); 
    strcpy (str3,str1); 
    strcpy (str2,str0);// crash happened here str2 is bad pointer!!! 
    printf ("str1: %s\nstr2: %s\nstr3: %s\n",str1,str2,str3); 
    delete str2; 
    return 0; 
} 
+0

Определите «более подвержен ошибкам». – immibis

+0

'str2' более подвержен ошибкам (например, в этом случае вы забыли« удалить »его) и, вероятно, медленнее –

+2

Просим вас пометить как C++ not C, str2 = new char [40]; is not C – BobRun

ответ

3

Помимо того, что str2 является указателем, тогда как str3 массив (и указатель является немного более хитрым, чтобы использовать, так как вы можете забыть удалить его и т.д.), есть еще одна проблема: память выделенная для str2, находится на свободном месте, через operator new. Это медленная операция. Напротив, str3 имеет автоматическую продолжительность хранения, и чаще всего его память выделяется в стеке, что намного быстрее. Таким образом, в критическом критически важном коде это может иметь значение.

+0

Я понимаю, что вы только что объяснили ........ но я не могу пройти через голову, является ли «Плохой указатель» недопустимым указателем или будет выдавать результат, но с предупреждением ?, что означает указатель BAD, такой же, как указатель SLOW, или медленный и плохой, означает что-то другое технически. (я надеюсь, что вы поймете, что я имею в виду, что указатель SLOW по-прежнему будет законным и ему будет разрешено безопасно выполнять вывод и в основном без предупреждений и ошибок, но указатель BAD - это просто ошибка и невозможность выполнить) правильно, я имею в виду вот как у меня был образ этого. –

+1

Плохой указатель - ваш худший кошмар. Использование его - неопределенное поведение, и программа может решить сбой после кажущейся работы в течение 1 года. – vsoftco

+0

oh, так что это означает, что указатель BAD будет выполняться и работать корректно или странно, но он будет работать, я получил это правильно ?. и указатель SLOW? было бы в этом случае/контекстом. plz извините мою глупую инквизицию, но ее долгое время у меня похожий запрос, свисающий в моей серой области ... Я думаю, сегодня я мог бы просто положить конец этому, поскольку этот вопрос правильно нацелен на то, с чем я боролся месяцами. –

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