Hi all,

As we know, gcc would give us an error message when we do this:
`struct _test a; char *s = a;`;

However, when we use this in printf/fprintf, it gets wired.
```c
#include <stdio.h>

struct _test {
        char name[256];
};
struct _test tests[100];

int main(int argc, char *argv[])
{
        memcpy(tests[0].name, "hello0", 6);
        memcpy(tests[1].name, "hello1", 6);
        memcpy(tests[2].name, "hello2", 6);

        for (int i = 0; i < 3; i++) {
#if 1
                /* output hello1 */
                printf("%s\n", tests[i]);
                /* output looks to be all right */
                printf("%d %s\n", i, tests[i]);
                printf("%d %d %s\n", i, i, tests[i]);
#else
                printf("%s\n", tests[i], "hello gcc");
#endif
        }

        return 0;
}
```
Gcc just give a warning message, and copy the structure to stack,
some registers will be reset(%rsi...), then ignore the argument `tests[i]`,
which means `#else` will output `hello gcc`.

Should gcc give it an error to prevent a structure from converting to
char* in functions printf/fprintf?

Best regards,

Reply via email to