Почему значения моих переменных удаляются?

Я пытаюсь извлечь подстроки в 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.

чего вы пытаетесь добиться здесь? Например, где должна оказаться подстрока, которую вы вычисляете? Я ответил, объясняя, что происходит, но я не могу помочь вам заставить функцию работать должным образом без дополнительных подробностей @Ben Dent

CoffeeTableEspresso 27.05.2019 20:00
accumulate[2] = '\0'; равно неопределенное поведение, потому что он индексирует массив char accumulate[2]; за его пределами.
Weather Vane 27.05.2019 20:00

И то же самое с char set[2].

Weather Vane 27.05.2019 20:18
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

condition стирается, когда set определен, потому что вы не используете condition после того, как вы определили set, поэтому ваш компилятор оптимизируется, сохраняя их в одном месте.

accumulate стирается, когда вы возвращаетесь из функции, потому что это локальная переменная.

Я думаю, что причина больше связана с неопределенное поведение, чем с оптимизацией компилятора или локальными переменными.

Weather Vane 27.05.2019 20:19

@WeatherVane Мне придется с вами не согласиться. Даже после исправления записи за пределами границ я все еще вижу то же поведение. Это очень распространенная оптимизация для использования одного и того же фрагмента памяти для двух переменных, которые используются в разное время, как показано здесь.

CoffeeTableEspresso 27.05.2019 21:19

В этом случае оптимизация должна быть отключена при отладке. Мне было непонятно, что означает «стертое», когда UB всё портит.

Weather Vane 27.05.2019 21:23

Другие вопросы по теме