Wpis z mikrobloga

#programowanie Ponieważ zauważyłem, że programiści zarówno #jezykc jak i #cpp używają funkcji scanf. Często niektórzy niestety źle podają parametr do wypełnienia tablicy znakowej. Rozumiem, większość to byli początkujący. Przerażenie mnie jednak wzięło, jak w poradnikach na sieci takowe znalazłem. Dla równowagi do mojej skrzyni porad dodałem adekwatny wpis.
  • 9
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@KrzaQ2: Uroki tego hostingu, własciciel założył wint niż system jest w stanie uciągnąć i czasami się przywiesza od jakiegoś czasu. Obiecał, że to juz niedługo. Zobaczymy.

Jeśli chodzi o warningi, to część kompilatorów da ostrzeżenie, ale początkujący zazwyczaj te ostrzeżenia ignorują (jesli nie maja w opcjach wogóle wyłączonych). Zresztą właściciel jednej z porad się dziwił, jak zwróciłem mu na to uwagę, twierdził, że u niego działa prawidłowo i kompilator kompiluje.
  • Odpowiedz
@Kaczus2B:

O ile na niektórych systemach, przy tablicy statycznej może przypadkowo nawet to zadziałać,


Nie zgadzam się z tym. Standard gwarantuje moƶliwość konwersji dowolnego typu do char* oraz to, ƶe tablica zaczyna się jej pierwszym elementem. Więc o ile jest to błąd (przekazujesz char (*)[10] zamiast char*), to wedle mojego zrozumienia standard gwarantuje wykonanie zgodne z intencją kodera.
  • Odpowiedz
przy tablicy statycznej chyba masz rację, aczkolwiek - trzeba by się wczytać, czy na pewno standard to gwarantuje, natomiast proponuję zrobić taki eksperymet:

#include

void foo(char *s1, char *s2)
{
  • Odpowiedz
@Kaczus2B: Tablica to nie wskaźnik, nie ma znaczenia czy statyczna czy nie. Wskaźnik to zwykła zmienna, tablica to ciąg n zmiennych, który niejawnie się konwertuje do wskaźnika na jej pierwszy element przy pierwszej nadarzającej się okazji.
  • Odpowiedz
@Kaczus2B: Dla zobrazowania, porównaj te 2. struktury:

struct tab { int data[10]; };
oraz

struct ptr { int * ptr; };
Tutaj powinno być wszystko oczywiste. W przypadku zwykłych zmiennych (czy to o automatycznym czasie składowania, czy teƶ o statycznym) jest dokładnie tak samo, tylko bez opakowującej struktury.
  • Odpowiedz
@KrzaQ2: To, że to nie wskaźnik, to wiem, ale ma automatyczną konwersję. Przekazując do funkcji jest konwersja. Nie mam jedynie pewności czy tablica i &tablica pokazują ten sam adres, ale najwyraźniej tak. Czy jest to standardowe zachowanie - nie miałem czasu na razie poszukać po dokumentacji - pewnie nie prędzej niż za tydzień będę mógł się tym zająć, bo to nawet trochę ciekawe jest :)
  • Odpowiedz