Avatar billede mxs Nybegynder
16. juni 2007 - 20:18 Der er 7 kommentarer og
1 løsning

C strenge

Jeg har brugt de sidste par timer på at fordybe mig lidt i C verdenen, men jeg forstår ikke C sproget og dens fortolkning af strenge. Jeg sidder og roder lidt med strcpy, og to char*, men jeg forstår ikke hvorfor jeg ikke kan kopierer den ene over i den anden. Hertil har jeg forstået at man skal allokere plads på stakken eller heapen for at strcpy kan gøre udføre dette. Er det fordi den ikke ved hvor lang min source er? Det er nemlig dette jeg tror, men jeg vil gerne bekræftes i det.
Jeg har så prøvet at kopierer min ene char* over i den anden char* med memcpy for der kan jeg jo netop angive hvor lang den ene char* er, og for mig ligner det også at den bliver kopieret, da den ved runtime udskriver det jeg har kopieret, dog bliver der også kastet en SIGILL. Dette rækker dog udover min forståelse, og jeg vil gerne vide om der overhovedet er en måde at kopierer en char* over i en anden.
Min kode jeg har afprøvet kommer her

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;

int main()
{
  char * str = "hej ";
  char* str2;
  memcpy(str2,str, strlen(str)+1);
  cout << str2 << endl;
}


På forhånd tak
Avatar billede mxs Nybegynder
16. juni 2007 - 20:23 #1
:) Man skal altså også her allokere hukommelse. str2 peger jo ikke på noget. Jeg har prøvet med
char* str2 = new char; og her får jeg ingen fejl. Jeg er nok bare ikke så sikker i pointers endnu.
Avatar billede mxs Nybegynder
16. juni 2007 - 20:25 #2
Som jeg skriver først. Man skal allokere hukommelse. Her var det bare med arrays. Men et array kan vel opfattes som en const pointer til det første element og ved angivningen af arrayet har jeg jo allokeret noget på stakken. Her allokere jeg bare på heapen.
Avatar billede zaknafein Praktikant
16. juni 2007 - 21:01 #3
hvis du laver en memory allokering på heap virker det.
fx
char* str = "hej";
    char* str2;
    str2 = (char*)malloc(strlen(str)+1);
    memcpy(str2,str, strlen(str)+1);
    cout << str2 << endl;

Hvis du bare bruger new som her:

char* str = "hej";
    char* str2 = new char;
    memcpy(str2,str, strlen(str)+1);
    cout << str2 << endl;

går den ned hvis du tildeler for mange tegn i str!
fx char* str = "hejhejhejhejhejhejhejhej";

Så rager du rundt på uallokeret memory på heapen.
Avatar billede mxs Nybegynder
16. juni 2007 - 21:47 #4
Det forstår jeg godt. Det virker ikke hvis man laver samme trick med new? Altså new char[strlen(str)+1]? Eller er det noget helt andet?
Avatar billede zaknafein Praktikant
16. juni 2007 - 21:54 #5
Jo så virker det også. Så allokerere du jo strlen(str)+1 bytes i hukomelsen på heapen. Så addreserer du korrekt med memcpy.
Avatar billede mxs Nybegynder
16. juni 2007 - 21:55 #6
Tak. Jeg har altid haft den forståelse at pointers er smarte, men det er først nu når jeg har haft lidt C programmering at jeg virkelig kan se det smarte med pointers. Smid et svar og du skal få nogle point.
Avatar billede zaknafein Praktikant
16. juni 2007 - 22:25 #7
De er smarte når du fx skal sende et stort array med som parameter til en funktion.
Istedet for at værdien af den formelle parameter (den som du kalder funktionen med) bliver kopieret by value til den aktuelle parameter (den som selve funktionen har), kan du bare giver funktionen en pointer til det store array.
Selve pointeren fylder kun så meget som en integer.
Avatar billede zaknafein Praktikant
16. juni 2007 - 22:25 #8
svar.
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