Я пытаюсь извлечь подстроки в C. У меня есть вход в мою функцию строки (команда char []), и я вынимаю ее части. При отладке моего кода я заметил, что значения (условие и накопление) стираются, когда я достигаю более поздних частей функции. Почему это? (см. код ниже)
int multiply(char command[]) {
char condition[5];
memmove(condition, command, 4);
condition[3] = '\0';
char accumulate[2];
memmove(accumulate, &command[4], 1);
accumulate[2] = '\0';
char set[2];
memmove(set, &command[5], 1);
set[2] = '\0';
return EXIT_SUCCESS;
}
Согласно отладчику, условие стирается при определении набора, а накопление стирается при EXIT_SUCCESS.
accumulate[2] = '\0';
равно неопределенное поведение, потому что он индексирует массив char accumulate[2];
за его пределами.
И то же самое с char set[2]
.
condition
стирается, когда set
определен, потому что вы не используете condition
после того, как вы определили set
, поэтому ваш компилятор оптимизируется, сохраняя их в одном месте.
accumulate
стирается, когда вы возвращаетесь из функции, потому что это локальная переменная.
Я думаю, что причина больше связана с неопределенное поведение, чем с оптимизацией компилятора или локальными переменными.
@WeatherVane Мне придется с вами не согласиться. Даже после исправления записи за пределами границ я все еще вижу то же поведение. Это очень распространенная оптимизация для использования одного и того же фрагмента памяти для двух переменных, которые используются в разное время, как показано здесь.
В этом случае оптимизация должна быть отключена при отладке. Мне было непонятно, что означает «стертое», когда UB всё портит.
чего вы пытаетесь добиться здесь? Например, где должна оказаться подстрока, которую вы вычисляете? Я ответил, объясняя, что происходит, но я не могу помочь вам заставить функцию работать должным образом без дополнительных подробностей @Ben Dent