2016-03-29 2 views
0

Пусть у меня есть два структур различных типов EX:Установка различных STRUCT членов равные друг другу

typedef struct struct_A 
{ 
     int member_A1 
     char member_A2 
}STRUCT_A; 

typedef struct struct_B 
{ 
     int member_B1 
     char member_B2 
}STRUCT_B; 

, а затем они инициализируются как следует

void struct_A_init(STRUCT_A *struct_A_pointer) 
{ 
     int i; 
     for(i=0; i<=10; i++) 
     { 
      struct_A_pointer[i].member_A1; 
      struct_A_pointer[i].member_A2; 
     } 

} 

void struct_B_init(STRUCT_B *struct_B_pointer) 
{ 
     int i; 
     for(i=0; i<=10; i++) 
     { 
      struct_B_pointer[i].member_B1; 
      struct_B_pointer[i].member_B2; 
     } 

} 

, а затем определены глобально и используются как указано ниже

STRUCT_A struct_A_pointer[10]; 
    STRUCT_B struct_b_pointer[10]; 

some_function(types, types, types) 
{ 
    struct_A_pointer[0].member_A1 = struct_B_pointer[7].member_B1; 
} 

Почему бы не работать, если члены такой же тип? В настоящее время у меня такая же настройка, и я загружаю значения в struct_B_pointer [7] .memberB1, и когда я устанавливаю значение равным struct_A_pointer [0] .member_A1, он получает только значение 0. не то, что на самом деле находится в struct_B_pointer, и Я не знаю, почему это произойдет, если члены одного типа. Кроме того, я также пытался создать фиктивную переменную и попытался следующие

dummy_Var = struct_B_pointer[7].member_B1; 

    struct_A_pointer[0].member_A1 = dummy_Var; 

, но я получаю те же результаты, своего рода, что я мог бы обмануть систему, они с этим одним: р

Любые предложения или комментарии высоко оценили

Благодаря

+0

Показать программу, которая отображает проблему. – FredK

+1

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

+0

. Ваше последнее изменение не добавило никакого значения. До сих пор абстрактный пример был одобрен. Поэтому я отбросил ваше последнее изменение. – alk

ответ

0

Это

for(i=0; i<=10; i++) 
    { 
     struct_B_pointer[i].member_B1; 
     struct_B_pointer[i].member_B2; 
    } 

ничего не инициализирует. Фактически весь цикл представляет собой NOOP, который, в конечном счете, в основном, скорее всего, вызывает неопределенное поведение, обращаясь к 11-му элементу, который находится мимо массива.

Вы хотите петлю над только 10 элементов и назначить что-то для членов

for(i=0; i<10; i++) 
    { 
     struct_B_pointer[i].member_B1 = 42; 
     struct_B_pointer[i].member_B2 = 43; 
    } 

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

+0

Я вижу это, но им присваиваются новые значения независимо от кода – user6130096

+0

@ user6130096: Возможно, вы захотите использовать отладчик, выполняющий код, проверяя соответствующие переменные на разных этапах выполнения. – alk

+0

@ user6130096: Также просто удалите все эти вызовы UB из-за индексации массивов за пределы. После того, как UB был вызван, вы больше не можете доверять программе. С тех пор все может случиться. – alk

Смежные вопросы