HVAR gør jeg for at arbejde med C, så jeg kan lære mere om det & blive bedre til det?

Efter min mening lærer man noget bedre, hvis man bruger det et sted.

I sidste ende er sprog værktøjer til at lave noget, du vil bruge.

Jeg gør dette med det meste af det, jeg vil lære.

Men jeg er egentlig ikke sikker på, hvor jeg kan bruge C. Jeg kan ikke se, hvor jeg kan bruge det i virkeligheden, undtagen på kerner.


tl;dr
Hvor kan jeg bruge C til at lære om computerfundamentaler? Undtagen kerne-ting. (Prøver at specialisere mig i sikkerhed)


For at lære C, har jeg først løst alle mine (datastrukturer og algoritmer) spørgsmål selv, med reference til internettet/stackoverflow nogle gange for at få idéer.

En ting jeg har lært, er hvordan man skal sende arrays til en anden funktion. Har tænkt i uger over dette. “Er det ikke understøttet? Damn mand, hvordan skal jeg sende mine arrays for at løse mine problemer?”
Så fandt jeg ud af, at du først skal definere længden af arrayet, og derefter arrayet selv med den tidligere definerede længdevariabel. Og så kan det endelig sendes til en anden funktion!

Jeg har tidligere brugt klasse-wide variabler, og det var en dårlig oplevelse, for det er en dårlig sikkerhedspraksis og dårlig kodningspraksis.

Men SÅ lærte jeg om de magiske ting kaldet “pekere” og “referencer”!!! Og hvordan min løsning var også fjollet, fordi jeg kopierede arrayet unødvendigt, hvilket forårsagede ekstra hukommelsesforbrug. Dette fandtes ikke i andre sprog, og jeg troede, at de bare var tilfældige, unyttige og komplicerede ekstra funktioner, jeg ikke behøvede at bekymre mig om.

Jeg tror, jeg har fået fat i pekere og referencer også (nogenlunde). Cool, men jeg forstår ikke virkelig, HVOR jeg kan bruge dette sprog videre, for at lave mere avancerede ting og samtidig lære om det.

Eksempler er ting som hukommelseslækager, korruption, affaldsværdier og mange andre computerfundamentale ting relateret til C, som ofte tales om i sikkerhedskredse, og jeg ved INTET om dem, og ved ikke hvordan jeg kan støde på sådanne problemer.

Jeg talte om rust & C med en, som fortalte mig om et værktøj, der bruges i C til at rette hukommelseslækager, og jeg tænkte “Hvad for?” aldrig hørt om det!
Hvor kan jeg lære om disse ting? Jeg hører kun om dem i sikkerhedsforedrag!


Jeg vil gerne avancere inden for sikkerhed. For eksempel, binære filer dekompileres/disassembleres til både C og CPU-centrisk assembly i Ghidra og andre decompilere. Jeg har hørt, at C og assembly er lette at konvertere frem og tilbage, fordi C er tæt på assembly. Jeg skal på en eller anden måde lære om dem, så jeg kan forstå, hvad de snakker om i sikkerhedssnakke. Og også for at forbedre mig selv i reverse engineering, malware-analyse, sårbarhedsresearch osv.

Vi blev undervist i assembly i college. Vi kodede ting i assembly, som hvordan man multiplicerer uden at bruge mul, bare ved addition, loop og nop.
Så kodede vi direkte på Intel 8085/86 board. Det var fedt (men) jeg lærte en masse teori og ting, som jeg egentlig ikke fik helt fat i. Fik karakter C i det kursus. (A+ i OOP/DSA btw)

Tak fordi du læste

Tjek dette ud

Var det det værktøj til hukommelseslækager, Valgrind?

Jeg lærte om det på college. Min CS-grad havde klasser om C og C++ (blandt andre ting selvfølgelig).

At lære selv er meget sværere end at lære af en guidet ressource, fordi man ikke ved, hvad man ikke ved. Det kan være mere givende at have fundet ud af tingene selv, men man kan også gå glip af ting, man ellers ville vide, fordi de er blevet fortalt i klassen eller lignende.

En online ressource som MIT OCW kan have noget for dig, men jeg har ikke tjekket.

Jeg vil anbefale Linux eller FreeBSD netværksklient/server applikation, måske en simpel VPN eller et sikkert besked-system. Indlejret er også meget lærerigt, og kan hjælpe med at få praktikplads eller en virkelig junior-position, men det kan være svært at starte helt grøn i C og direkte til indlejret (medmindre du kan finde et kursus i detailhandel eller forlængelseskurser). Jeg elskede at arbejde med indlejret/firmware professionelt, og det har været det mest udfordrende i min karriere, men også utrolig belønnende og tillidsopbyggende. Men desværre er løn-udviklingshastigheden og loftet ekstremt lavt (i hvert fald hvor jeg var dengang), og det matcher ikke udfordringerne. Jeg fik effektivt dobbelt så høj løn for at lave programmering, der var mindst halvt så svært.

CS50 brother/sister!!!

gratis Harvard kursus fra den bedste C-professor i branchen!!

https://cs50.harvard.edu/x/2024/

C er et generelt formåls-sprog, der kan bruges overalt, så længe man er villig til at skrive en masse imperativ kode. Det bruges sjældent professionelt på denne måde, fordi det tager 10-20 gange flere linjer kode at løse et problem end i et sprog som Python, så det er ikke økonomisk.

Jeg foreslår at prøve TCP/IP socket programmering og systemprogrammering. Bøger som ‘Advanced Programming in the UNIX environment’ eller Windows via C/C++ er gode til dette.

WOW… Den bog ser fed ud af nogle grunde …

Vent, den lærer dig om Linux og Unix filsystemet, før den går i gang med C??!! Og vent, de fortæller også om gcc og gdb, i modsætning til andre bøger, der beder dig installere en tilfældig IDE? Vim eller Emacs? XD

Bogen ser cool ud!! Hvordan fik du fat i den???

Virkelig tak for at dele! Jeg vil helt sikkert kigge på den!!

Ja, valgrind! Vores professorer har aldrig dækket det :confused:

MIT OCW… Okay, jeg vil kigge på det!
Tak for hjælpen og for kommentaren!

Jeg bruger ofte linux (på desktop: Debian-baseret + xorg + OpenBox wm, på telefon: Termux)

Netværksklient/server er en rigtig god ide! Også VPN/besked!! De dækker både C & sikkerhedsaspekter. Vi skal være skarpe på netværk i sikkerhed. Så det burde være rigtig hjælpsomt! Tak for den fantastiske idé!

Måske prøver jeg også FreeBSD


Med hensyn til embedded, er min virkelige udfordring at have råd til hardware og ting, der skal bruges for faktisk at arbejde med det (kun brugt Arduino/esp8266, og måske grundlæggende elektronik med loddekolbe) …

Jeg spekulerer på, hvad embedded har lært dig? Som hvordan RAM og ting fungerer? Noget på det område?

Kursus ser godt ud, og fra Harvard!
Jeg vil undersøge det,

Tak for anbefaling & kommentar!

Folk har ofte anbefalet socketprogrammering, da vi skal have solid viden om netværk, hvis vi vælger sikkerhed som speciale

Okay, systemprogrammering, jeg vil kigge på det

Jeg vil også se på den bog, du nævnte

Tak for anbefalinger & kommentar!

ESP32s er billige, under $10. Du sigter mod at bygge noget, der udfører opgaver hurtigt og pålideligt, du skal kunne lave noget med begrænset ydeevne (CPU-hastighed og kerner) og hukommelse, du skal lære om at holde ting i SRAM (CPU-registre) vs DRAM (kørende kode og data), og om at fejlsøge sådanne systemer uden logs og begivenheder, du kan få fra Linux/Windows applikationer.

Indlejrede programmører er meget praktiske, mens programmører uden for akademiet kan være det modsatte (det er selvfølgelig ikke alle, men det har været almindeligt, i de steder jeg har arbejdet). Praktisk erfaring slår, hvor du dimiterede fra, og hvor lang tid du har været i skole.

Esp32 er ekstremt billige og kan bruges til praktiske projekter - esphome framework gør det nemt at integrere esp32-baseret hjemmebygget smart home hardware med Home Assistant-økosystemet. Tænk automatiserede kattefodere, grundlæggende objekterkennung osv.

Når det gælder færdigheder, er den største forskel mellem C/C++ og højere sprog: a) mere detaljeret kode; b) værktøjskæde; c) manuel hukommelsesstyring. A og B er faktisk noget, du kan vælge undervejs, og du skal genlære det ved forskellige projekter. Hukommelsesstyring er faktisk let at lære, men har mange skjulte nuancer, som du kun kan lære gennem erfaring. At kode en binær trægennemgang ville være en god måde at blive fortrolig med det grundlæggende.

Ærligt talt, ville jeg ikke bekymre mig for meget om det. Hvis du starter din karriere med noget, der kræver pegere og C - giver du dig selv masser af tid til at lege med det.

Det vil være meget mere nyttigt at prøve at udvikle et moderat komplekst projekt / løse et interessant komplekst problem i ethvert sprog, du vælger, bare for at lære at tænke i kodeformat.