Różnica między char* a char[]

0

Tak jak w temacie jaka jest różnica między:

 char* 

a char tekst[]

 ?
1

Pierwszy to wskaźnik, a drugi tablica znaków.

0

Tylko że w obu można zapisać tekst, więc jaka jest różnica między tymi zapisami.

3

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".

1
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ę

1

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.

0
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/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".

Czyli w drugiej opcji jest wyciek pamięci?

1
 
#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 :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1