Cokolwiek chcesz zrobić, prawdopodobnie zły pomysł. A jeśli już musisz - użyj struktury.
Kompilator nie ma obowiązku układać sobie zmiennych w programie w jakiś konkretny sposób. Na przykład taki kod:
const char *a = "asdfghjk";
char b[] = "qwertyui";
char c[10];
int main()
{
puts(a);
puts(b);
puts(c);
}
Deklaruje trzy zmienne, które (w pliku PE na Windowsie) powinny pójść do zupełnie innych sekcji:
- a jest wskaźnikiem w sekcji danych R/W (.data w przypadku gcc), wskazuje na początek napisu przechowywanego w sekcji danych read-only (.rdata na gcc).
- b jest napisem przechowywanym w całości w sekcji R/W (.data w przypadku gcc)
- c jest napisem (tzn. tablicą charów) niezainicjalizowanym, przechowywanym w sekcji danych niezainicjalizowanych (.bss na gcc)
Nie ma szans żeby to znalazło się koło siebie w pamięci.
Dowód, tak to wygląda po kompilacji:
mov eax, off_402000
mov [esp+10h+var_10], eax
call puts
mov [esp+10h+var_10], offset aQwertyui ; "qwertyui"
call puts
mov [esp+10h+var_10], offset unk_405068
call puts
Powiedzmy że poprawne rozwiązanie:
struct stupid_hack
{
const char *a;
char b[8];
char c[10];
} awful_hack = { "asdfghjk", "qweryui" };
int main()
{
puts(awful_hack.a);
puts(awful_hack.b);
puts(awful_hack.c);
}