Das hier funktioniert (deine Art einzurücken ist GRAUENHAFT!)

Code:
#include <iostream>


using namespace std;

class person
{
    private:
        char name[30];
        int alter;
        char ort[50];
    public:
        void erzeuge(const char* n = "Waise", unsigned int a = 0, const char* ort = "nirgends");
        void ausgeben(void);
};

int main(void)
{
    person mensch;
    int wahl;
    
    auswahl:
    
    cout << "Personenverwaltung - 0.1\n";
    cout << "Was moechten sie tun?\n";
    cout << "1) Anzeigen 2) Erzeugen\n";
    cin >> wahl;
    
    switch (wahl)
    {
        case 1:
            mensch.ausgeben();
            break;
        case 2:
            mensch.erzeuge("Tom", 8, "Pimmelhausen"); 
            system("cls");
            cout << "Tom wurde erzeugt\n";
            goto auswahl;
    }   
    system("PAUSE");
}

void person::erzeuge(const char* n, unsigned int a,const char* ort)
{
    strncpy(name, n, sizeof(name) - 1);
    // durch die gleiche Benennung des Klassen-Attributes und des
    // Parameters entsteht eine Namenskollision.
    // Wir arbeiten mit dem this-Zeiger um das Klassen-Attribut
    // ansprechen zu können.
    strncpy(this->ort, ort, sizeof(this->ort) - 1);
    // nicht notwendig:
    //name[sizeof(name)] = '\0';
    alter = a;
}

void person::ausgeben ( void )
{
    cout << name << " " << alter << " Jahre (";
    cout << "Wohnort : " << ort << ")\n";
}
Der Fehler von AlterHacker liegt hier:
strncpy(this->ort, ort, sizeof(ort)-1);
ort ist hier ein Zeiger auf einen char.
Der Zeiger an sich ist 4 Byte groß.
Daraus folgt:
strncpy(this->ort, ort, 4-1);
strncpy(this->ort, ort, 3);

Ansonsten:
this->ort[sizeof(ort)] = 0;
auch hier feht wieder das this-> vor dem rot markieren ort.
Außerdem wird das setzen eines 0-Bytes bereits von strncpy erledigt.
Diese Code-Zeile ist somit redundant.


mfG. BlackBerry