Это
strcpy(&test, "test");
неверно, компилятор мог бы предупредить вас, как показано ниже, если вы скомпилировали свой код с флагом, например -Wall -Wstrict-prototypes -Wpedantic -Werror
.Никогда не игнорируйте предупреждение компилятора.
ошибка: передача аргумента 1 'strcpy' из несовместимого типа указателя [-Werror] strcpy (& test, "test");^
, поскольку &test
относится к типу doublechar*
, а "test"
относится к типу char*
, а копирование char*
в doublechar*
приводит к приведенному выше сообщению об ошибке.
Также здесь
typedef union {
double num; /* 8 byte gets allocated for whole union as this member needs the highest memory */
char chr;
} doublechar;
doublechar
является объединением, то есть здесь все члены разделяют общий mmory, который составляет 8
байт в 32-bit
системе
--------------------------------------------------
| | |
--------------------------------------------------
MSB <-- LSB
num
chr <-- both num and chr access memory from beginning
Также это
strcpy(&test.chr, "test"); // this does not work
printf("%s\n", &test); /* format specifier is wrong */
вызывает неопределенное поведение , поскольку test.chr
имеет тип char
, копирование более чем 1
char
не рекомендуется, так как это может перезаписать содержимое следующего элемента, но будьте осторожныпри этом.
Также спецификатор формата printf
неверен, %s
ожидает аргумент типа char*
и &test
не char*
.Вы хотите, как показано ниже
strcpy(&test.chr, "t"); /* test.chr is of char type, */
printf("%c\n", test.chr); /* use %c as chr is of char type*/
printf("%p\n",(void*)&test); /* use %p if you want to print address */
Также здесь
strcpy (& test.num, "test");// это работает
Нет, это не работает , поскольку test.num
имеет тип double
типа, а не char*
, ваш компилятор мог предупредить вас как
примечание: ожидается 'char * restrict ', но аргумент имеет тип 'double *'
, вы можете использовать memcpy()
вышеслучай.