Изменения переменных после увеличения размера 2D-массива

Слово записывается в 0-ю строку и столбец двумерного массива. Когда я изменяю размер массива, чтобы подготовиться к сохранению другого слова, я сохраняю слово в 0-й строке и столбце во временной переменной. После того, как я вызываю функцию, которая увеличивает размер 2D-массива, переменная temp меняется на что-то очень странное. Например, я передал «i», и после увеличения размера строк переменная temp, в которой хранится i, изменяется. Почему это происходит?

void make_row_decode_structure_bigger(int rows){
    printf("inside the making the rows bigger \n");
    int max_rows = rows+1;

    char **store = realloc( decode_structure, sizeof *decode_structure * (rows + 2) );
    printf("after a store has been assigned\n");    
    if (store){ 
        decode_structure = store;
        for(size_t i = 0; i < 2; i++ ){

            decode_structure[rows + i] = calloc(20, sizeof(char));
        }
    }
    printf("end of making the rows increase\n");
    return;
    //decode_structure[max_rows][0] = '\0';
}

//other part of code
char* temp;
        strncpy(temp, decode_structure[0], 20);
        printf("this word %s is at the top of decode_structure\n", temp);
        printf("make the rows bigger is being called\n");
        make_row_decode_structure_bigger(num);
        printf("temp after make_row_decode_structure_biggeris called %s \n", temp);

это вывод:

это слово i находится вверху decode_structure сделать строки больше вызывается внутри делая ряды больше после того, как магазин был назначен конец увеличения строк temp после make_row_decode_structure_bigger вызывается Ó«

В char* temp; strncpy(temp, decode_structure[0], 20);temp не инициализирован, поэтому это поведение undefined. Он использует некоторую случайную память, которая либо стирается, либо стирается что-то еще.

Weather Vane 07.04.2019 12:32
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
27
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Здесь:

char* temp;
strncpy(temp, decode_structure[0], 20);

вы используете в качестве места назначения копии неинициализированный указатель, который вызывает неопределенное поведение (UB).

Вместо этого используйте char temp[20];, или, если вам действительно нужен указатель, используйте malloc для динамического выделения памяти, на которую будет указывать указатель, например: char* temp = malloc(sizeof(char) * 20);.

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