Funckja strcpy

0

Witam, mam taki kodzik:

#include<iostream>
#include<cstdio>
#include<cstring>                                                               //biblioteka do operacji na c-stringach
#include<cstdlib>
using namespace std;

int main()
{
 char a[]={"Pierwsza tablica znakow. "}, 
      b[]={"Druga tablica znakow. "}, 
      c[]={0};
      
 cout<<"Obecne wartosci tablic:\na: ";
 for(int i=0;i<strlen(a);i++) cout<<a[i];
 cout<<"\nb: ";
 for(int i=0;i<strlen(b);i++) cout<<b[i]; 
 cout<<"\nc: ";
 for(int i=0;i<strlen(c);i++) cout<<c[i]; 
 
 strcpy(c, a);                                                                  //wstawia zawartosc a[] do c[]
 
 cout<<"\n\nObecne wartosci tablic:\na: ";
 for(int i=0;i<strlen(a);i++) cout<<a[i];
 cout<<"\nb: ";
 for(int i=0;i<strlen(b);i++) cout<<b[i]; 
 cout<<"\nc: ";
 for(int i=0;i<strlen(c);i++) cout<<c[i]; 
 
 cout<<"\n\n";  
 system("PAUSE");   
}

uzywam sobie funkcji strcpy, czemu pomimo, ze nie wykonuje zadnej operacji na tablicy znakowej b, jej zawartosc sie zmienia?

0

Horror to jest. Stworzyłeś tablicę na 1 znak a wpisałeś do niej napis "Pierwsza tablica znakow. "
A czemu zmienia się zawartość tablicy B? Właśnie dlatego. Obie tablice są położone obok siebie więc wychodząc za zakres tablicy C wchodzisz na tablicę B najwyraźniej.

0

To jak to w końcu jest.
Gdzieś czytałem, że jeśli np, zainicjalizuję sobie tak:
a[10]={"tekst"};
to będzie to przechowywane tak:
|t|e|k|s|t|0|0|0|0|0| (czyli po prostu, reszta zostanie uzupełniona zerami).

Jeśli natomiast dałbym tak:
a[]={"tekst1"};
to niby miało być tak przechowywane:
|t|e|k|s|t|0| (czyli po prostu, na samym końcu jedynie NULL zostanie dodane).

?

0

Ale co to ma do rzeczy? Stworzyłeś tablicę na jeden znak a wpisałeś do niego chyba 25 znaków. I się dziwisz jeszcze że zepsułeś sobie wartości innych zmiennych które były w okolicy. o_O
Wyobraź sobie że pamięć nie jest z gumy i taki zapis:

 char a[]={"ala"}, 
      b[]={"ma"}, 
      c[]={"kota"};

Zostanie w pamieci zapisane mniej więcej tak: (to nie jest regula, mogą być w zupełnie innych miejscach pamięci, ale wtedy takie cuda jakie zrobiłeś spowodują segfaulta pewnie)
a|l|a|0|m|a|0|k|o|t|a|0
(ew wyrazy będą od końca, bo to w końcu stos jest ;) )
A ty sie dziwisz że jak w miejsce "ma" wpiszesz sobie "sierotka ma rysia" to nagle zepsują ci się też inne zmienne.

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