Zum Inhalt springen

char, *char und char[]


sayso

Empfohlene Beiträge

hallo,

mal kurz eine frage zu den variablentyen:

char test[20] => dann habe ich ein char array in das ich 20 zeichen stellen kann, jedes zeichen einzel ansprechbar

char test => eine variable mit einem zeichen oder?

char *test => Zeiger auf Inhalt eines Speicherbereich

Wenn ich die variable als zeiger definiere, kann ich ja einen mehr als 1 zeichen in die variable stellen.

z.B so:.

char *test = "";

test = "ich bin eine testvariable";.

Und nun die Frage:

Wieviel Zeichen kann ich in die Variable test stellen wenn sie vorher als zeiger definiert worden ist? Gibt es da auch ne Begrenzung (bestimmt?!).

Danke!

Gruß

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

Wieviel Zeichen kann ich in die Variable test stellen wenn sie vorher als zeiger definiert worden ist? Gibt es da auch ne Begrenzung (bestimmt?!).

ja:


warning: string length `600' is greater than the length `509' ISO C89 compilers are required to support

Du darfst den String aber nicht verändern, weil das undefiniertes Verhalten erzeugt. D. h. was einmal da drin steht, steht drin, für den Rest des Programms.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Beispiel ist so im Prinzip falsch. Da test nur ein Zeiger ist musst du diesen entweder auf eine andere Variable zeigen lassen, oder dir selber Speicherplatz reservieren und den Zeiger darauf zeigen lassen.

Ich hab das aber gerade auch mal so wie du ausprobiert und es scheint zu funktionieren. Deshalb gehe ich davon aus das der Compiler das intern in sowas umwandelt:


char *test;
char test2[] = "teeeeeest";
test = test2;
[/PHP]

Dabei könntest du einen beliebig langen String angeben.

Ich persöhnlich würde dir aber nicht empfehlen das so wie du es gemacht hast zu machen ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

ja:


warning: string length `600' is greater than the length `509' ISO C89 compilers are required to support

Du darfst den String aber nicht verändern, weil das undefiniertes Verhalten erzeugt. D. h. was einmal da drin steht, steht drin, für den Rest des Programms.

Hi,

alles klar.

wo hast du das mit der warning her?

Aber ich kann doch den Inhalt des Speicherbereiches wieder initilaisieren mit

test = "";

und wieder neu benutzen?! Wenn etwas drinsteht und ich schreibe drüber ist es klar, das es zu undefinierten verhalten kommen kann.

hmmmm

Ich persöhnlich würde dir aber nicht empfehlen das so wie du es gemacht hast zu machen

im der unix programmierung finde ich aber viele solche beispiele... naja

Link zu diesem Kommentar
Auf anderen Seiten teilen

Aber ich kann doch den Inhalt des Speicherbereiches wieder initilaisieren mit

test = "";

und wieder neu benutzen?! Wenn etwas drinsteht und ich schreibe drüber ist es klar, das es zu undefinierten verhalten kommen kann.

Nein, du hast das Zeigerprinzip nicht richtig verstanden. :)

Ein Zeiger ist immer 4 Byte groß (zumindest auf einem 32Bit System) und enthält nur eine Adresse, das ist alles.

Wenn du nun sowas machst:


char *test="";
[/PHP]

Wird meiner Einschätzung nach vom Compiler irgendwo fest Speicher reserviert um einfach einen Leerstring aufzunehmen, also eine binäre 0.

Also im Prinzip wieder so was:

[PHP]
char *test;
char test2[] = "";
test = test2;

Das heißt du hast einmal 4 Byte für den Zeiger belegt und einmal 1 Byte für den Leerstring.

Machst du nun sowas:


test = "test";
[/PHP]

wird nicht der Leerstring überschrieben, sondern es wird ein neuer String vom Compiler angelegt und test verweist nun darauf. Also sowas in der Art:

[PHP]
char *test;
char test2[] = "";
test = test2;
char test3[] = "test";
test = test3;

D.h. du hast jetzt die 4 Byte für den Zeiger, 1 Byte für den Leerstring und 5 Byte für den andere String belegt.

Ich hoffe das es dadurch etwas klarer wird, das es keinen Sinn macht Zeiger so zu benutzen.

Um es noch etwas besser zu verdeutlichen mal ein gegenspiel wie man das bekommt was du willst:


#include <stdio.h>
#include <malloc.h>
#include <string.h>


int main()
{
char *test = NULL; // Zeiger initialisieren
test = (char*)malloc(5 * sizeof(char)); //Platz für 5 Zeichen reservieren
strcpy(test,"test"); //4 Zeichen + binäre 0 in reservierten Speicher kopieren
printf ("%s\n",test);
test = (char*)realloc(test,12 * sizeof(char)); //Speicher auf 12 Zeichen erweitern
strcpy(test,"Langer Test"); // 11 Zeichen + binäre 0 in Speicher kopieren
printf ("%s\n",test);
free(test); // Speicher wieder freigeben WICHTIG!!
return 0;
}
[/PHP]

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nein, du hast das Zeigerprinzip nicht richtig verstanden. :)

Ein Zeiger ist immer 4 Byte groß (zumindest auf einem 32Bit System) und enthält nur eine Adresse, das ist alles.

Wenn du nun sowas machst:


char *test="";
[/PHP]

Wird meiner Einschätzung nach vom Compiler irgendwo fest Speicher reserviert um einfach einen Leerstring aufzunehmen, also eine binäre 0.

Also im Prinzip wieder so was:

[PHP]
char *test;
char test2[] = "";
test = test2;

Das heißt du hast einmal 4 Byte für den Zeiger belegt und einmal 1 Byte für den Leerstring.

Machst du nun sowas:


test = "test";
[/PHP]

wird nicht der Leerstring überschrieben, sondern es wird ein neuer String vom Compiler angelegt und test verweist nun darauf. Also sowas in der Art:

[PHP]
char *test;
char test2[] = "";
test = test2;
char test3[] = "test";
test = test3;

D.h. du hast jetzt die 4 Byte für den Zeiger, 1 Byte für den Leerstring und 5 Byte für den andere String belegt.

Ich hoffe das es dadurch etwas klarer wird, das es keinen Sinn macht Zeiger so zu benutzen.

Hi,

ok wenn es so ist macht es keinen Sinn... voraussgesetzt der Compiler gibt das 1 Byte für den Leestring nicht mehr frei.

Soll heissen. Ich sollte es lieber so machen:

char test[]="ich bin eine testvariable";

char *testz = test;

richtig?

ist zwar umständlicher und nicht so "angenehm". aber wenn der compiler das 1 byte nicht mehr sauber frei gibt... macht es sinn...

noch ne kurze frage:

gebe ich keine anzahl in der [] an wieviel allokiert er dann?

also bei

char test[]="ich bin eine testvariable";

nimmt er dann die maximale byte anzahl oder nur die benötigten für die zeichen?

danke :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

richtig?

ist zwar umständlicher und nicht so "angenehm". aber wenn der compiler das 1 byte nicht mehr sauber frei gibt... macht es sinn...

doch der Speicher würde freigegeben werden weil dieser auf dem Stack angelegt wird. Ich hab dir aber oben noch ein Beispiel mit angefügt.

noch ne kurze frage:

gebe ich keine anzahl in der [] an wieviel allokiert er dann?

also bei

char test[]="ich bin eine testvariable";

nimmt er dann die maximale byte anzahl oder nur die benötigten für die zeichen?

)

Nur die benötigten. Die maximal Verfügbaren wäre sehr sehr groß;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

Deshalb gehe ich davon aus das der Compiler das intern in sowas umwandelt:


char *test;

char test2[] = "teeeeeest";

test = test2; 

Wieso sollte er das tun? Das sind zwei verschiedene Dinge. In deinem Beispiel zeigt der Zeiger test auf das erste Element von test2, also dem t. Ab da kann ich einzelne Zeichen verändern. Das wäre erlaubt:

test[3]='b';

Aber das ist nicht erlaubt:

char *test;

char test = "teeeeeest";

...

test[3]='b';

Also ist das nicht äquivalent, somit kann der Compiler da auch nix machen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

ok wenn es so ist macht es keinen Sinn... voraussgesetzt der Compiler gibt das 1 Byte für den Leestring nicht mehr frei.
Stringliterale habens statische Lebensdauer, brauchen also nicht freigegeben zu werden. Die sind da, solange das Programm läuft.

Soll heissen. Ich sollte es lieber so machen:

char test[]="ich bin eine testvariable";

char *testz;

testz = test;

richtig?

Solange dir klar ist, dass testz jetzt auf das Array test zeigt. Kopiert wird da nichts, wenn du testz änderst, änderst du auch test. Immerhin darfst du das.

gebe ich keine anzahl in der [] an wieviel allokiert er dann?
Anzahl der Zeichen im Literal plus eins für das Nullzeichen.
Link zu diesem Kommentar
Auf anderen Seiten teilen

doch der Speicher würde freigegeben werden weil dieser auf dem Stack angelegt wird. Ich hab dir aber oben noch ein Beispiel mit angefügt.

Nur die benötigten. Die maximal Verfügbaren wäre dein kompletter Speicherplatz ;)

ok mit malloc ist es natürlich am saubersten :)

Danke.. jetzt hat sich für mich das Mysterium auch geklärt ;)

Mit kompletten Platz meinte ich die 509 Zeichen ;)

Solange dir klar ist, dass testz jetzt auf das Array test zeigt. Kopiert wird da nichts, wenn du testz änderst, änderst du auch test. Immerhin darfst du das.

Ja das ist klar.. aber die methode die ich aufrufen will erwatet einen zeiger :)

Und was ist nun mit dem freigeben?

Wird er nun freigegeben oder nicht ...

Guybrush meinte er wird und Klotzkopp meint nicht :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wieso sollte er das tun? Das sind zwei verschiedene Dinge.

Ich hab mich etwas undeutlich ausgedrückt. Ich meinte nicht genau sowas, sondern etwas ähnliches. Das Beispiel sollte dazu dienen zu verdeutlichen das es jedesmal verschiedene Speicherbereiche sind auf die test zeigt.

@sayso

Es wird automatisch beim Beenden des Programms bzw beim verlassen der Funktion freigegeben wenn du sowas machst:


char test[] = "test";
[/PHP]

nur wenn du dir selber Speicher reservierst, mit malloc, calloc oder sonstwas dann musst du den selber wieder freigeben.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich hab mich etwas undeutlich ausgedrückt. Ich meinte nicht genau sowas, sondern etwas ähnliches. Das Beispiel sollte dazu dienen zu verdeutlichen das es jedesmal verschiedene Speicherbereiche sind auf die test zeigt.

@sayso

Es wird automatisch beim Beenden des Programms bzw beim verlassen der Funktion freigegeben wenn du sowas machst:


char test[] = "test";
[/PHP]

nur wenn du dir selber Speicher reservierst, mit malloc, calloc oder sonstwas dann musst du den selber wieder freigeben.

ok aber was ist mit der char *test = "dies ist ein test" lösung/möglichkeit?

Wird es das byte nun freigegeben oder nicht?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Da hast du nur einen Zeiger auf ein Literal, da gibt es nichts freizugeben.

na bei der array erklärung von guy ist es aber so dargestellt...

hier nochma der quote

wird nicht der Leerstring überschrieben, sondern es wird ein neuer String vom Compiler angelegt und test verweist nun darauf. Also sowas in der Art:

char *test;

char test2[] = "";

test = test2;

char test3[] = "test";

test = test3;

Link zu diesem Kommentar
Auf anderen Seiten teilen

Es muss nirgendwo was freigegeben werden. Nirgendwo. Es sei denn, du benutzt malloc und free, aber das wurde doch schon erklärt. Das Stringliteral wird irgendwo im Binary gespeichert, und bei Abruf wird an die Stelle gesprungen.

Wenn ich mir mein auf Linux produziertes Binärfile angucken (alle Strings extrahiere) sieht das so aus:


/lib/ld-linux.so.2

libc.so.6

printf

_IO_stdin_used

__libc_start_main

__gmon_start__

GLIBC_2.0

PTRh0

QVh<

dieser text steht in einem Array

Dies ist ein Test

Die letzten beiden sind meine Literale, die ich im Quellcode erzeugt habe.

Link zu diesem Kommentar
Auf anderen Seiten teilen

ob das eine byte von

char test2[] = "";

freigegeben wird

test2 ist ein Array mit automatischer Lebensdauer, d.h. das Array wird zerstört, wenn das Programm den Scope verlässt, in dem die Variable definiert ist. Das Literal, das für die Initialisierung benutzt wird, hat statische Lebensdauer - wie alle Stringliterale.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Es muss nirgendwo was freigegeben werden. Nirgendwo. Es sei denn, du benutzt malloc und free, aber das wurde doch schon erklärt. Das Stringliteral wird irgendwo im Binary gespeichert, und bei Abruf wird an die Stelle gesprungen.

Wenn ich mir mein auf Linux produziertes Binärfile angucken (alle Strings extrahiere) sieht das so aus:


/lib/ld-linux.so.2

libc.so.6

printf

_IO_stdin_used

__libc_start_main

__gmon_start__

GLIBC_2.0

PTRh0

QVh<

dieser text steht in einem Array

Dies ist ein Test

Die letzten beiden sind meine Literale, die ich im Quellcode erzeugt habe.

ich weiss das ICH es nicht machen muss. da der compiler das alles selbst regelt solange ich keine alloc kommandos verwende.

mich hat es halt nur interessiert :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

So nochmal ich :)

Habe jetzt die Lösung gefunden warum auch mein anfangscode funktioniert hat:

char *test;

Die Lösung steht hier:

http://home.fhtw-berlin.de/~junghans/cref/CONCEPT/string.html

Das man ihn dann nicht ändern kann da er zu einer Konstanten wird, ist klar... ansonsten mit malloc arbeiten :)

Noch ne kurze Frage:

Beim Übergeben von char Zeigern gibt es doch ne besonderheit?

Hab mal was gelesen das etwas kopiert oder auch nicht kopiert wird, finde es blos nicht mehr :-\

Aber einer von euch weiss das doch bestimmt :)

Welche besonderheit hat char?

Und noch eins:


char *test = "Testmessage";

printf("%s",test);

Obiger Beispielcode gibt mir ja "Testmessage" aus. Warum muss ich hier nicht zwingend "printf("%s",*test);" schreiben? Denn so würde doch erst auf den Wert de Speicheradresse verwiesen oder? Oder regelt das die "printf funktion" und sieht das es ein zeiger auf ein Literal ist und interpretiert dann richtig?

Link zu diesem Kommentar
Auf anderen Seiten teilen

So ein Update.

Ich habe ein bischen getestet und folgendes:

char *test = "Testmessage";

printf("%s",*test);

Bringt einen Speicherzugriffsfehler... ist mir jetzt auch klar warum... kein erklärungsbedarf mehr ;)

char *test = "Testmessage \n";

printf("%s",test);

test = "muhh \n";

printf("%s",test);

Gibt mir folgendes aus:

Testmessage

muhh

D.h. ich kann auch test ändern und brauche dazu nicht unbedingt den malloc.

Irgendwie bin ich jetzt total konfus. Ich dachte wenn man mit char *test arbeitet ist es eine konstante...

Könnte das jetzt mal jemand richtig stellen, wann ich was brauche und warum?

Denn ich sehe jetzt ehrlich nicht mehr den Sinn hinter den malloc.... wenn ich auch alles mit char *test machen kann...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

Habe jetzt die Lösung gefunden warum auch mein anfangscode funktioniert hat:

das wurde dir ungefähr über 2 Seiten erklärt.

D.h. ich kann auch test ändern und brauche dazu nicht unbedingt den malloc.

Du solltest dir evtl. mal ein Buch kaufen. Ich empfehle das hier:

http://www.amazon.de/exec/obidos/ASIN/3446154973

Irgendwie bin ich jetzt total konfus. Ich dachte wenn man mit char *test arbeitet ist es eine konstante...

Der Zeiger zeigt auf eine Konstante, d. h. das, auf was er zeigt, kann nicht verändert werden. Du kannst aber natürlich den Zeiger auf etwas anderes zeigen lassen, was du in deinem Beispiel machst. Wenn du auch das nicht willst, schau dir mal, wie man const einsetzt.

EDIT: Das %s in printf sorgt dafür, dass alle Zeichen bis zum \0 auf die Standardausgabe ausgegeben werden.


char *test = "test"

Das sind nicht 4 Zeichen, sondern 5, weil hinter dem letzten t noch ein \0 steht. Diese Null steht für das Ende des Strings.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Der Zeiger zeigt auf eine Konstante, d. h. das, auf was er zeigt, kann nicht verändert werden. Du kannst aber natürlich den Zeiger auf etwas anderes zeigen lassen, was du in deinem Beispiel machst. Wenn du auch das nicht willst, schau dir mal, wie man const einsetzt.

Hi,

ok wenn man es so sieht, ist es logisch.

wenn der zeiger durch ändern der Literale automatisch auch einen anderen Speicherbereich nimmt (= auf etwas anderes zeigt), dann erklärt sich auch warum man es ändern kann..

Für mich war der Begriff "Konstante", ein wirklich konstanter Wert der nicht verändert werden kann.

Wird der alte Speicherbereich eigentl. automatisch wieder freigegeben (ohne beendigung des programms oder ohne verlassen von funktionen in der der zeiger verwendet wird) wenn der Zeiger "umgebogen" wird, oder bleibt der speicherbereich allokiert bis das programm oder die funktion verlassen wird.

Und letzte Frage:

Welche Besonderheit gibt es bei Char zeigern und übergaben? Ich dachte einmal das ich etwas gelesen habe, das irgendwas nicht kopiert wird. Finde es aber nicht mehr oder liege ich da falsch...

Es ist das erste mal das ich in diesem Umfang mit Zeigern auf char Variablen arbeite, deswegen die Verständnisprobleme....

Ich fasse zusammen:

* malloc verwende ich wenn ich wirklich zeichen innerhalb eines literals ändern will

* die char *variable lösung kann ich verwenden wenn ich den Literal nicht editieren will aber vllt. irgendwann mal einen anderen wert in der variable stehen haben will...

@ carsten j:

habe mal ein kleines beispiel programm geschrieben, aber hier sehe ich das trotzdem die gleiche speicheranfangsadresse verwendet wird. wie meinst du das dann das zeiger auf etwas anderes zeigt?


#include "stdafx.h"

#include <stdio.h>


int main(int argc, char* argv[])

{

	char *test;


	test = "test 1";

	printf ("1. test char: %s \n",test);

	printf ("1. Speicherbereich von char: %d \n", &test);


   	test = "test 2";

	printf ("2. test char: %s \n",test);

	printf ("2. Speicherbereich von char: %d \n", &test);


	return 0;

}

hier die ausgaben:

1. test char: test 1

1. Speicherbereich von char: 1245052

2. test char: test 2

2. Speicherbereich von char: 1245052

Press any key to continue

Danke füre eure Antworten bis hier her :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

Wird der alte Speicherbereich eigentl. automatisch wieder freigegeben (ohne beendigung des programms oder ohne verlassen von funktionen in der der zeiger verwendet wird) wenn der Zeiger "umgebogen" wird, oder bleibt der speicherbereich allokiert bis das programm oder die funktion verlassen wird.

Lies dir mal die Beiträge durch, die bisher dazu geschrieben wurden. Ich denke das Thema ist mittlerweile zur Genüge durchgekaut worden....

habe mal ein kleines beispiel programm geschrieben, aber hier sehe ich das trotzdem die gleiche speicheranfangsadresse verwendet wird. wie meinst du das dann das zeiger auf etwas anderes zeigt?

Wenn du die Adresse haben willst, auf die ein Zeiger zeigt, solltest du auf die Adresseoperatoren (&) verzichten:


...

        printf ("1. Speicherbereich von char: %d \n", test);

...

	printf ("2. Speicherbereich von char: %d \n", test);

...

Welche Besonderheit gibt es bei Char zeigern und übergaben? Ich dachte einmal das ich etwas gelesen habe, das irgendwas nicht kopiert wird. Finde es aber nicht mehr oder liege ich da falsch...

Was meinst du genau? Verstehe ich nicht so ganz...

Link zu diesem Kommentar
Auf anderen Seiten teilen

wenn der zeiger durch ändern der Literale automatisch auch einen anderen Speicherbereich nimmt (= auf etwas anderes zeigt), dann erklärt sich auch warum man es ändern kann..
In dem Code wird kein Literal geändert. Dein Zeiger ist wie ein Stück Papier, auf dem du mit Bleistift eine Adresse notierst.

Für mich war der Begriff "Konstante", ein wirklich konstanter Wert der nicht verändert werden kann.
Wie gesagt, mit Bleistift. Du kannst das jederzeit ausradieren und eine andere Anschrift aufschreiben. Das heißt aber nicht, dass du damit irgendwie das Haus beeinflussen kannst, das an der Adresse steht.

Wird der alte Speicherbereich eigentl. automatisch wieder freigegeben (ohne beendigung des programms oder ohne verlassen von funktionen in der der zeiger verwendet wird) wenn der Zeiger "umgebogen" wird, oder bleibt der speicherbereich allokiert bis das programm oder die funktion verlassen wird.
Wird irgendein Haus abgerissen, oder zieht jemand um, nur weil du auf deinem Zettel eine andere Adresse aufschreibst?

Ob du einen Zeiger an eine andere Stelle zeigen lässt, hat auf den allozierten Speicher überhaupt keinen Einfluss.

Welche Besonderheit gibt es bei Char zeigern und übergaben? Ich dachte einmal das ich etwas gelesen habe, das irgendwas nicht kopiert wird. Finde es aber nicht mehr oder liege ich da falsch...
Es ist da wie mit allen Zeigern. Der Zeiger wird kopiert, nicht das, worauf er zeigt.

Es ist das erste mal das ich in diesem Umfang mit Zeigern auf char Variablen arbeite, deswegen die Verständnisprobleme....
Ich glaube, es ist das erste mal, dass du überhaupt mit Zeigern arbeitest. Vielleicht solltest du nicht gerade mit char-Zeigern anfangen, weil die nunmal eine Sonderbehandlung bekommen.

* malloc verwende ich wenn ich wirklich zeichen innerhalb eines literals ändern will

Nein. Malloc verwendest du, wenn du eine Lebensdauer über den Scope hinweg haben willst oder die Größe eines Arrays erst zur Laufzeit kennst.

* die char *variable lösung kann ich verwenden wenn ich den Literal nicht editieren will aber vllt. irgendwann mal einen anderen wert in der variable stehen haben will...
Ich glaube, dir ist nicht ganz klar, was Literal bedeutet. Ein Literal ist eine Konstante in deinem Quellcode. Es gibt in C Ganzzahl-, Fließkomma-, Zeichen- und Zeichenkettenliterale. Zeichenkettenliterale sind die einzigen, von denen du überhaupt eine Adresse bekommen kannst. Du kannst aber den Inhalt nicht über diese Adresse ändern, ohne undefiniertes Verhalten zu erzeugen.

habe mal ein kleines beispiel programm geschrieben,
In Ergänzung zu carstenjs Antwort: In deinem Programm gibst du die Adresse der Zeigervariablen aus, nicht die Adresse, auf die der Zeiger zeigt.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...