Avatar billede mxs Nybegynder
06. juni 2007 - 17:20 Der er 6 kommentarer

char*. Er dette en forkert måde at gøre det på?

Hej eksperten

Jeg har en struct med en char* og i min main har jeg også en char*. Denne char* i main vil jeg gerne have over i min struct, men jeg ved ikke om jeg gøre det på en forkert måde da jeg bare bruger = operatoren. Skal jeg bruge en strcpy()? Ville det være mere sikker, eller vil det bare være den rigtige måde at gøre det på? Jeg har prøvet at printe deres adresser ud, og for mig ser det ud til at de alle har forskellige adresser. Min store frygt er vel bare pointeren, som jo egentlig her bliver repræsenteret som en tekst streng. Jeg er ikke den habile C programmør, derfor mit spørgsmål.
Min kode er her:
#include <iostream>
using namespace std;

struct structS
{
  char* pso;
  char* pst;
};



int main()
{


  struct structS ss;
  char* char_po = "hej";
  char* char_pt = char_po;
  ss.pso = char_po;
  ss.pst =char_pt;
  cout << char_po << " " << &char_po << endl;
  cout << char_pt << " " << &char_pt << endl;
  cout << ss.pso << " " << &ss.pso << endl;
  cout << ss.pst << " " << &ss.pst << endl;
}

Jeg ved godt at dette IKKE er ren C, da jeg har visse elementer af STL'en indover, jeg bruger dog char* og ikke string.

Mvh. Martin Slot
Avatar billede tokelil Nybegynder
06. juni 2007 - 17:46 #1
& udskriver adressen på din variabel, mens det du vil udskrive (så vidt jeg forstår) er adressen på strengen: "hej".

strcpy() skal bruges når du vil kopiere en streng og det er ikke det du gør her! Alle dine variable peger på samme statiske streng. ("hej")

Hvis du skal kopiere en streng, så skal der allokeres plads enten på stack eller heap til det. F.eks.:

char* char_po = "hej";
char  char_copy[4];
strcpy(char_copy, char_po);

hvorefter char_copy indeholder "hej".
Avatar billede mxs Nybegynder
06. juni 2007 - 17:50 #2
Jeg vil jo bare gerne vide om pointerne peger på det samme sted i hukommelsen, for så har jeg jo ikke rigtig lavet en kopi :) Så jeg skal vel ud i noget kopering?
Avatar billede tokelil Nybegynder
06. juni 2007 - 18:13 #3
Well i det kode du har, da vil pointerne pege på samme sted i hukommelsen og du har IKKE lavet en kopi af "hej".

Jeg vil tro du kan udskrive dine pointere med:
cout << char_po << " " << (int)char_po << endl;
Avatar billede mxs Nybegynder
06. juni 2007 - 18:45 #4
Jep. Jeg er vant til at arbejde med normale pointere, men dette er i med objekter i C++ og her udarbejder jeg jo en operator= som netop kopierer data'erne for mig, men dette er pointer og ikke en char pointer. Jeg har aldrig arbejdet med char* før, men jeg er da blevet lidt klogere :) Så vil jeg igang med strcpy.
Avatar billede bertelbrander Novice
06. juni 2007 - 22:49 #5
Martin, du skriver: "her udarbejder jeg jo en operator = som netop kopierer data'erne for mig"
En = operator for en char * (eller anden pointer) kopierer netop ikke data, den sætter bare pointerne til at pege på noget. Uanset om det er i en struct eller class om det er C eller C++
Avatar billede mxs Nybegynder
12. juni 2007 - 15:34 #6
bertelbrander << Ja :) Men jeg blander jo det hele sammen. Mere det jeg vil frem til. Jeg skal også lige vende mig til at den første indgang i et array er det samme som en const pointer, og derfor kan bruges i C funktionerne som tager en const pointer. Der er så meget der er ny for mig i C verdenen, men jeg kan allerede nu se at jeg får mere og mere indblik i programmeringen da jeg føler at jeg kommer lidt tættere på med C programmeringen, og det har også været en øjenåbner for min C++ programmering... Nå men nok om min livshistorie.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester