Witam,
Ucze sie ANSI C (uzywam sobie C99, bo prawde mowiac jak chce to i tak moge sie dostosowac do C89 a tak mi jest wygodniej). Chce korzystajac z semestru ANSI C dojsc do przyzwoitego poziomu w poslugiwaniu sie wskaznikami. Napisalem nastepujcy kod:
#include<stdio.h>
#include<stdlib.h>
int mystrlen(const char* buf)
{
int chars = 0;
while(*buf++)
chars++;
return chars;
}
int mystrcpy(char* target, const char* source)
{
while(*source)
*target++ = *source++;
}
char* mystrdup(const char* str)
{
char* new = NULL;
int length = mystrlen(str);
if( (new = malloc(sizeof(char) * (length + 1))) == NULL ) {
fprintf(stderr, "Cannot allocate memory!\n");
return NULL;
}
while(*str) {
*new = *str;
new++;
str++;
}
// nie rozumiem dlaczego nie wyswietli sie
printf("%s\n", new);
return new;
}
int main()
{
const char* test = "Test string!";
char* new = NULL;
int length = mystrlen(test);
new = malloc(sizeof(char) * (length + 1) );
printf("Test: %d\n", length);
printf("%s\n", test);
mystrcpy(new, test);
printf("%s\n", new);
char* another = mystrdup(new);
printf("%s\n", another);
free(another);
free(new);
return 0;
}
Weźmy niedziałający fragment:
while(*str) {
*new = *str;
new++;
str++;
}
Kazdy lancuch znakow w jezyku C powinien byc zakonczony '\0', ktorego wartosc liczbowa jest rowna 0. Zero to falsz, wiec jesli natrafimy na ten znak petla zakonczy sie.
Podajac nazwe tablicy np. 'char* new przez' new wskazujemy na jej 1 element (chyba ze wczesniej cos dodalismy do wskaznika). W przypadku lancuchow new i str nic wczesniej nie bylo dodawane. Dlaczego to sie nie chce kopiowac?
Chce, aby funkcja mystrdup zwrocila wskaznik na 1 element tablicy char*. I w ten sposob uzyskam dostep do lancucha znakow zapisanego gdzies na stercie. Oczywiscie musze pamietac o tym, ze nie mam garbage collectora i musze wywolac free().