Tak jak w temacie jaka jest różnica między:
char*
a char tekst[]
?
Zasadnicza. Jak przypiszesz c-stringa do tablicy znaków to kompilator utworzy na stosie tablicę o odpowiednim rozmiarze i wpisze do niej tego stringa. Ale jak przypiszesz c-stringa do wskaźnika to ten wskaźnik będzie tylko pokazywał na obszar pamieci gdzie kompilator umieścił ten napis. W szczególności nie musi to być obszar stosu, ani w ogóle obszar pamięci którą mógłyś modyfikować.
edit: materiał poglądowy:
Tablica:
http://ideone.com/rEb3pO
Wskaźnik:
http://ideone.com/IgGPaF
Jak widać pierwsza opcja działa bo modyfikujemy dane w tablicy na stosie. Druga wersja się wysypuje bo próbujemy modyfikować napis w pamięci "stałej".
fajnygosc napisał(a):
Tylko że w obu można zapisać tekst
Nie można.
char tekst[10];
tekst[0] = 'a';
tekst[9] = 'z';
to jest poprawne
char* wsk;
wsk[0] = 'a';
to NIE jest poprawne.
char tekst[10];
char* wsk = tekst;
wsk[0] = 'a';
to jest poprawne, bo wsk
wskazuje na istniejącą tablicę
Jeżeli to o co pytasz jest podano jako argument funkcji np:
void foo(char *text) { }
void foo(char text[]) { }
to nie ma praktycznie żadnej różnicy.
Z tym że w pierwszym przypadku możesz w środku procedury napisać: text=malloc(100);
i od teko momentu ten text będzie wskazywać na co innego.
Przykład wydumany, sensownego raczej nie istnieje. Podano go tylko po to aby nie pisać że nie ma żadnej różnicy - bo to odbiegałoby od prawdy.
Shalom napisał(a):
Zasadnicza. Jak przypiszesz c-stringa do tablicy znaków to kompilator utworzy na stosie tablicę o odpowiednim rozmiarze i wpisze do niej tego stringa. Ale jak przypiszesz c-stringa do wskaźnika to ten wskaźnik będzie tylko pokazywał na obszar pamieci gdzie kompilator umieścił ten napis. W szczególności nie musi to być obszar stosu, ani w ogóle obszar pamięci którą mógłyś modyfikować.
edit: materiał poglądowy:
Tablica:
http://ideone.com/rEb3pO
Wskaźnik:
http://ideone.com/IgGPaFJak widać pierwsza opcja działa bo modyfikujemy dane w tablicy na stosie. Druga wersja się wysypuje bo próbujemy modyfikować napis w pamięci "stałej".
Czyli w drugiej opcji jest wyciek pamięci?
#include <iostream>
#include <conio.h>
#include <cstring>
using namespace std;
char *funkcja1(){
char tekst[] = "Tekst w zmiennej lokalnej (tracisz go w momencie wyjścia z pętli / funkcji)";
return tekst;
}
char *funkcja2(){
char *tekst = new char[10];
strcpy(tekst, "jakis tam tekst");
return tekst;
}
int main()
{
char *tekst1 = funkcja1();
char *tekst2 = funkcja2();
cout << "tekst1: " << tekst1 << endl;
cout << "tekst2: " << tekst2 << endl;
delete tekst2;
getch();
}
Poczytaj o zmiennych lokalnych. za pomocą char[] tworzysz zmienną lokalną, zaś tworząc wskaźnik i alokując w nim pamięć dopóki dysponujesz tym wskaźnikiem możesz zawsze odwołać sie do zmiennej. Jak widzisz, funkcja 1 wyświetliła Ci jakies krzaczki. To dlatego, ponieważ przy wyjściu z funkcji tekst został bezczelnie usunięty :)
w pierwszym przypadku
- w drugim też można