Det du gör är väl pekare till sträng-konstanter? Då lägger man väl lämpligen konstanterna separat?
För som du gör nu kommer A att peka på ett "X\0" nånstans i minnet. Tilldelar du A ett annat värde så skriver du över pekaren, och det där X:et kommer ligga bortglömt i minnet och inte gå att hitta igen.
Eller är jag helt ute och cyklar nu? (Det var många år sen jag faktiskt kodade i C)
typedef char *charPointer_t;
typedef char[] charArray_t;
charArray_t a = "X"; // Array av storlek 2, initialiserad av strängliteral
charArray_t b = "Y"; // Array av storlek 2, initialiserad av strängliteral
charArray_t c = "Zebra"; // Array av storlek 6, initialiserad av strängliteral
// Nedanstående går inte i varken C eller C++:
a = "B";
a = b;
// Nedanstående är tillåtet i C men inte i C++ eftersom
// en sträng-literal i C++ har typen "const char[]".
// medans C fortsätter att använda typen "char[]" för sträng-literaler.
charPointer_t p = "Y";
// Undefined behaviour även i C. Kan leda till att programmet krashar.
p[0] = '?';
Ett värde inramad i " är en sträng. Den består av minst 1 byte i form av 0x00 som är EOT (End Of Text).
Har man en char är den bara 1 byte och om man t.ex. pekar på "X" blir det rent faktisk en pekning till en sträng ('X', 0x00) vilket inte kan göras med en pekare till en char.
Men om man castar den kan det gå utmärkt - ganska enkelt för att castningen gör att man berättar för kompilern att man VET att man gör dumheter.
Så det är ganska logisk att det inte går rakt av.
sodjan skrev: ↑26 september 2020, 19:02:39
> 1 byte i form av 0x00 som är EOT (End Of Text).
0x00 är NUL (eller null)
"End of Text" = ETX = 0x03.
("Start of Text" = STX = 0x02...
Sen så används NUL som "slut på strängen" i C (hjärndött, men så är det).
Och EOT är "End Of Transmission". I ASCII är det 0x04. I UNIX har man valt att använda EOT / 0x04 / Ctrl-D för att signalera end of file om man skickar det via terminalen. I EBCDIC är EOT 0x37.
sodjan skrev: ↑26 september 2020, 19:02:39
Sen så används NUL som "slut på strängen" i C (hjärndött, men så är det).
Det tycker jag inte. På den tiden då C utvecklades så hade processorer få register och minne var dyrt.
I processorer brukar värdet noll ha en särställning: att det inte kostar några register eller extra instruktioner att kolla om ett värde är noll.
Problemet är snarare att man förlitar sig på en "slut på strängen"-markör överhuvudtaget istället för att skriva längd och/eller kapacitet i sträng-typen från början.
Senast redigerad av Findecanor 27 september 2020, 11:05:11, redigerad totalt 1 gång.
typedef char *charPointer_t;
typedef char[] charArray_t;
charArray_t a = "X"; // Array av storlek 2, initialiserad av strängliteral
charArray_t b = "Y"; // Array av storlek 2, initialiserad av strängliteral
charArray_t c = "Zebra"; // Array av storlek 6, initialiserad av strängliteral
// Nedanstående går inte i varken C eller C++:
a = "B";
a = b;
// Nedanstående är tillåtet i C men inte i C++ eftersom
// en sträng-literal i C++ har typen "const char[]".
// medans C fortsätter att använda typen "char[]" för sträng-literaler.
charPointer_t p = "Y";
// Undefined behaviour även i C. Kan leda till att programmet krashar.
p[0] = '?';
Hänger inte riktigt med på ovanstående.
Det fungerar inte att byta ut koden så här, syntax error
typedef char* CharPointer;
CharPointer A = "X";
CharPointer B = "Y";
Är inte problemet att du försöker tilldela en "const char *" till en variabel deklarerad som "char *"? (Det hela vore så mycket enklare om du angav vilket felmeddelande du får. )