массив на C внутри forloop

#c #arrays

#c #массивы

Вопрос:

Что происходит, когда я пишу array[i] = '' внутри цикла for?

 char arrayPin[256];

for(int i = 0; i<256; i  ) 
{ 
    arrayPin[i] = ''; 
}
  

Комментарии:

1. Другой способ сделать то же самое в этом конкретном случае — memset(arrayPin, 0, 256);

Ответ №1:

Программа пытается получить доступ к памяти в расположении <base address of 'array'> (<sizeof array element> * 'i') и присвоить ему значение 0 (двоичный 0, а не символьный ‘0’). Эта операция может завершиться успешно, а может и нет, и может даже привести к сбою приложения, в зависимости от состояния ‘array’ и ‘i’.

Если ваш массив имеет тип char* or char[] и операция присваивания выполнена успешно, то вставка двоичного символа 0 в позицию ‘i’ приведет к усечению строки в этой позиции, когда она используется с вещами, которые понимают строки в стиле C ( printf() это один из примеров).

Итак, если вы сделаете это в for цикле по всей длине строки, вы уничтожите все существующие данные в строке и заставите их интерпретироваться как пустая строка нулевой длины устройствами, которые обрабатывают строки в стиле C.

Ответ №2:

 char arrayPin[256];
  

После строки выше, arrayPin в неинициализированном массиве, содержимое которого неизвестно (при условии, что оно не является глобальным).

      ----------------------------
     |?|?|?|?|?|?|?|?|?|?|...|? |
     ----------------------------
byte: 0 1 2 3 4 5 6 7 8 9     255
  

Следующий код:

 for(int i = 0; i<256; i  ) 
{ 
    arrayPin[i] = ''; 
}
  

инициализирует каждый arrayPin элемент значением 0:

      ----------------------------
     |0|0|0|0|0|0|0|0|0|0|...|0 |
     ----------------------------
byte: 0 1 2 3 4 5 6 7 8 9     255
  

Ответ №3:

Я полагаю, у вас есть что-то вроде char *array . В этом случае он запишет символ с кодом 0x00 в i -ю позицию.

Это весьма полезно при работе со строками ANSI. указывает на конец строки. Например:

 char str[] = "Hello world";
cout << str << endl; // Output "Hello world"
str[5] = '';
cout << str << endl; // Output just "Hello"
  

Комментарии:

1. Изменение содержимого строкового литерала на самом деле является неопределенным поведением. Используйте char str[] = "Hello world"; , если хотите изменить строку.