Zmiana z int na char*

0

Witam !

Przeglądałem pewne programy w C i natrafiłem na takie coś :

#include <stdio.h>
main() {
  long long P = 1,
            E = 2,
            T = 5,
            A = 61,
            L = 251,
            N = 3659,
            R = 271173410,
            G = 1479296389,
            x[] = { G * R * E * E * T , P * L * A * N * E * T };
  puts((char*)x);
}

Z tej stronki : https://codegolf.stackexchange.com/questions/22533/weirdest-obfuscated-hello-world

No i nie chciało działać ale nie to mnie zastanawiało co bardziej zastanawiało mnie zmiana typu int na char*.
Jak to dokładnie działa ?
Próbowałem to podobnie zrobić tutaj bo też chciałem zrozumieć różnicę między puts a printf("%s\n") i coś takiego miałem :

int main()
{
    // using puts to print hello world
    int x = {12,10};
    char* str1[] = {"Hello Geeks", "XD"};
    
 	for (int i = 0; i < 1; i++)
    {
    puts((char*)x[i]);
    printf("%s\n", (char*)x[i]);    
    puts(str1[i]);
    printf("%s\n", str1[i]);
    }
    
    puts("Welcome Geeks");
 
    return 0;
}

Działało połowicznie ...
Bo trochę nie rozumiem co wtedy się dzieje jak zmieniam INT na CHAR*, czy wtedy np 12 staje się adresem na którą wskazuje wskaźnik czy już wartością ?

A no i też trochę mi się zapomniało jak to jest że * str1 rozróżnia który z nich jest wskaźnikiem ? Mam na myśli rząd i kolumnę, tutaj kolumny są przesuwane według wskaźnika a my możemy wybierać konkretny rząd tym "[]", pamiętałem kiedyś ale sporo tego nie używałem i lekko gubię się wskaźnikach i w konwertowaniu zmiennych.

Z góry dziękuję !

5

Tu powinno byc lepiej widac co sie dzieje:

#include <stdio.h>
#include <stdint.h>
int main() {
  char text[4] {'H', 'e', 'l', '\0'};
  uint32_t u = (text[3] << 24) | (text[2] << 16) | (text[1] << 8) | text[0];
  puts((char*)&u);
}

Przyklad ktory podales to to samo, tylko bardziej.
Inaczej: tekst to sa jakies dane w pamieci. Tablica liczb tez. Dokladnie te same dane moga byc roznie intepretowane. Dla liczb endian ma znaczenie w interpretacji.

4

Ten kod to Underfunded Behavior. Czemu? Wystarczy uruchomić ten kod na maszynie z inną endianą i będzie kwiatek w postaci, że ten kod wypisze oW olleH.
Do tego dochodzą bardziej egzotyczne maszyny, gdzie char nie jest 8-bitorwy.

Ale tak jak to jest z UB może to działać i zadziała na 99.9% maszyn, bo większość maszyn spełnia warunki małej endiany i 8 bitowego char.

0

puts oczekuje nul na końcu tak btw.

Zasadniczo to jest po prostu głupie ( ten kod ) -> potencjalnie overflow

I nie int na char * tylko long long * na char *

1 użytkowników online, w tym zalogowanych: 0, gości: 1