2016-10-19 15 views
7

Я пытаюсь понять следующий фрагмент кода, но меня путают между «\ 0» и «\ 0». Я знаю его глупо, но любезно помогите мнеразница между « 0» и « 0»

#define MAX_HISTORY 20 

    char *pStr = "\0"; 
    for(x=0;x<MAX_HISTORY;x++){ 
     str_temp = (char *)malloc((strlen(pStr)+1)*sizeof(char)); 
     if (str_temp=='\0'){ 
      return 1; 
    } 
    memset(str_temp, '\0', strlen(pStr)); 
    strcpy(str_temp, pStr); 

заранее спасибо

+0

'char * pStr =" \ 0 ";' Я думаю, это не то, что вы думаете. Вы объявляете указатель и пишете что-то в нем. Это будет адрес, на который он указывает. Сделайте «malloc» там, а затем заполните выделенную память. Или вы можете просто использовать массив символов. –

+2

@KamiKaze Я думаю, 'char * pStr =" \ 0 ";' не то, что вы думаете. Он объявляет указатель, значение которого является ** адресом строкового литерала **, который содержит два nul байта. Не нужно malloc быть правильным. –

+0

@ Jean-BaptisteYunès Mhh, ты заставил меня задуматься. Каково время жизни памяти, в которой находятся два nul байта? –

ответ

8

Двойные кавычки создают строковые литералы. Таким образом, "\0" является строковым литералом, содержащим единственный символ '\0', а второй - как терминатор. Это глупый способ написать пустую строку ("" - это идиоматический способ).

Одиночные кавычки для символьных литералов, так '\0' является int -sized значение, представляющее символ со значением кодирования 0.

нит в коде:

  • Не отбрасываемой возвращение значение malloc() в C.
  • Не масштабируйте распределения на sizeof (char), это всегда 1, поэтому оно не добавляет значения.
  • Указатели не являются целыми числами, вы должны сравнить их с NULL.
  • Вся структура кода не имеет смысла, есть выделение в цикле, но указатель отбрасывается, просачивая много памяти.
+1

Не забудьте пропустить утечку памяти (перезаписывает ссылку на выделенную память в цикле). –

+1

Не использовать 'sizeof (char)' в malloc - очень субъективное мнение стиля, я не понимаю, почему люди продолжают делать это замечание. Люди могут набирать sizeof (char) явно, потому что они хотят иметь последовательный стиль кодирования независимо от типа и всегда вызывают malloc как 'malloc (n * sizeof (type))'. Это добавляет ценность самодокументирующего кода. Чтобы утверждать, что это не значит, что мы не должны писать 'char * ptr = malloc (n * sizeof (* ptr))', но переписываем это как 'char * ptr = malloc (n)', но только если тип это символ. – Lundin

+0

Это не глупый способ создать пустую строку, поскольку она просто не создает пустую строку. Он просто создает строковый литерал, который не является строкой, см. 6.4.5/6 note 78 –

10

Они отличаются.

"\0" строковый литерал, который имеет два последовательных 0 и примерно эквивалентно:

const char a[2] = { '\0', '\0' }; 

'\0' является int со значением 0. Вы можете всегда 0, где вам нужно использовать '\0'.

6

\0 - символ нулевого терминатора.

"\0" такое же, как {'\0', '\0'}. Это строка, написанная запутанным программистом, который не понимает, что строковые литералы всегда имеют нулевое завершение автоматически. Правильно написанный код был бы "".

Линия if (str_temp=='\0') - вздор, это должно было быть . Теперь, когда это происходит, \0 эквивалентен 0, который является константой нулевого указателя, поэтому код работает, к счастью.

Принимая strlen строки, где \0 - первый символ, не имеет большого значения. Вы получите нулевую длину строки.