char [] манипуляции в C - PullRequest
0 голосов
/ 04 мая 2011

Предположим, я определил следующее:

unsigned char temp[2][13];

Какие значения по умолчанию будут присвоены этому char[]?Это как {'', '', '', ... , ''}?

В моей программе (калькулятор) у меня есть operand[2][13] (где первый операнд operand[0], а второй операнд operand[1]), и у меня есть Операция и Result[15]и все они unsigned char.Во-первых, пользователь введет Operand1 и Operand2 (символ за раз), и он будет сохранен в operand[2][13], затем программа сохранит результат в виде символов в Result[15].Теперь на следующей итерации я хочу очистить operand[2][13], операцию и Result[15], чтобы пользователь мог ввести следующие операнды, а программа выполняет следующую операцию и сохраняет результат в Result[15].

Как я могу очистить эти массивы?

Ответы [ 5 ]

3 голосов
/ 04 мая 2011

memset(operand, 0, 2 * 13);
memset(Result, 0, 15);

2 голосов
/ 04 мая 2011

'' не является значением. На самом деле не имеет смысла указывать «пустой» символ.

Обычно данные не инициализируются для вас. Данные будут теми, которые были в памяти до того, как вы их распределили. Исключением является то, что если это статические данные, то значение должно быть равно нулю ('\ 0').

Обычно вы должны планировать инициализацию таких данных самостоятельно, используя такую ​​функцию, как memset().

2 голосов
/ 04 мая 2011

Нет значений по умолчанию. Вовсе нет. Убедитесь, что вы установили их самостоятельно. Вот одна удобная форма:

unsigned char temp[2][13] = {0};
1 голос
/ 04 мая 2011

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

глобальные и статические массивы инициализируются в 0 (ноль)

unsigned char aglobal[2][13]; /* all zeroes */
int foo(void) {
    static unsigned char astatic[2][13]; /* all zeroes */
    unsigned char aauto[2][13]; /* unset, ub to read values */
}

Вы можете инициализировать с вашими предпочтениями, хотя

unsigned char tmp[2][13] = {{1, 2, 3, 4, 5}, {11}};

Приведенная выше инициализация приводит к тому, что все элементы равны 0 (нулю), кроме tmp[0][0] до tmp[0][4] и tmp[1][0].

Или установите элементы один за другим в середине кода после инициализации:

for (j=0; j<2; j++) {
    for (k=0; k<13; j++) {
        tmp[j][k] = 0;
    }
}
1 голос
/ 04 мая 2011

Это зависит от контекста, в котором оно определено.

Если он объявлен вне функции (глобально), он будет находиться в разделе .bss исполняемого файла, и операционная система инициализирует весь массив до нуля при запуске программы до вызова main.

Если он объявлен локально (в стеке), он будет содержать любой мусор, а затем вы можете либо инициализировать его с помощью memset, либо с помощью соответствующего инициализатора массива.

...