2015-02-27 4 views
0

Я пишу в C учебную программу по шифрованию и Met с неожиданной проблемой:основной() параметры испортите объявления массива

Когда я включаю параметры в main() функции (как int main(int argc, char* argv[])) и попытаться объявить отдельный массив символов в моем коде (char array[2] = {'a','b'};), который не имеет ничего общего с аргументами main(), этот массив каким-то образом получает длину 8 вместо 2 и некоторый бачок добавляется к нему при попытке распечатать его (например, ab ?iQ?).

Принимая во внимание, что я объявляю main() без каких-либо параметров (int main()), заявленный массив символов ведет себя нормально: получает размер 2 и выводит как ab.

Есть ли в параметрах main() ограничения на набор минимальных размеров массивов в коде?

+0

'этот массив как-то получает длину 8 вместо 2', почему вы так говорите? –

+0

, который является значением, возвращаемым функцией strlen (array) –

+1

Вы не можете поместить строку с двумя символами в массив с пространством для 2 байтов. Строка требует 3 байта. Вы можете поместить два байта в массив, но тогда это не строка ... и функции * string * не работают с ним. – pmg

ответ

2

Использование strlen() в массиве char без байта nul приводит к неопределенному поведению.

Строка в C, состоит из последовательности байтов, не являющихся nul завершаются nul ->'\0' байт, так что этот

char array[2] = {'a','b'}; 

должно быть

char array[3] = {'a', 'b', '\0'}; 

для strlen(), чтобы работать должным образом ,

Вы можете реализовать strlen() как этого

size_t stringlength(const char *string) 
    { 
     size_t length; 
     length = 0; 
     while (string[length] != '\0') 
      length++; 
     return length; 
    } 

так, если '\0' не существует, он будет продолжать чтение из массива beond это граница вызывает неопределенное поведение, упомянутое выше.

+0

Спасибо, что работает! Если я правильно понимаю, инструкция типа «char array [3] = {'a', 'b'} 'добавит' nul 'автоматически? –

+3

Да. 'char array [3] = {'a', 'b'};' добавляет NUL. В C. Частичная инициализация отсутствует. Все элементы инициализируются на '0' в отсутствие другого значения. – pmg

+0

@DenysTriasunov: с 'char array [3] = {'a', 'b'}' компилятор не будет добавлять нулевой символ автоматически, но с 'char array [3] =" ab "' он будет Кстати, вам не нужно указывать это '3'. –

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