Вот мой демонстрационный код:
#include <stdio.h>
#define WORK 0
typedef struct FooStruct {
int x;
} FooStruct;
void setX(FooStruct *foo_ptr) {
FooStruct foo = *foo_ptr;
if (WORK) {
foo_ptr->x = 10;
} else {
foo.x = 10;
}
}
FooStruct makeFoo() {
FooStruct foo = { 0 };
setX(&foo);
return foo;
}
int main(void) {
FooStruct foo = makeFoo();
printf("X = %d\n", foo.x);
return 0;
}
Если для WORK задано значение 1, код выполняется должным образом и печатает «X = 10».
Однако, если для WORK установлено значение 0, вместо этого выводится «X = 0», или если FooStruct не инициализирован по умолчанию (т. Е. Измените FooStruct foo = {}; на FooStruct foo;), valgrind выдаст значение неинициализированная ошибка в строке printf.
Я уверен, что это связано с пробелом в моем понимании, но для меня две разные ветви РАБОТЫ должны по существу быть идентичными в работе, поэтому я не уверен, откуда исходит недоразумение.
Это скомпилировано с gcc 8.2.0 с / без valgrind с равными результатами.
=======================
EDIT:
Упрощенный пример:
#include <stdio.h>
#define WORK 0
void setX(int *x_ptr) {
if (WORK) {
*x_ptr = 5;
} else {
int x = *x_ptr;
x = 5;
}
}
int main(void) {
int x = 0;
setX(&x);
printf("X = %d\n", x);
return 0;
}