Dlaczego pointer zamiast referencji wywala mi program?

0

Siema, umiem w c++, a na studia musze umieć w C. Mam zadanie żeby zaalokować N stringów. Mam taki program napisany w C++, ale tak jakbym pisał go w C, tylko, że z referencją zamiast pointerem.

int main()
{
    int n = 5;
    static const int MAX_STRING_LENGTH = 32;

    char** strings = (char**)malloc(n * sizeof(char*));
    for(int i = 0; i < n; ++i) {
        char*& string = strings[i];
        string = (char*)malloc(MAX_STRING_LENGTH);

        const char charset[] = "ABCDEFGHIJKLMNOPRSTUWXYZ";
        for(int j = 0; j < MAX_STRING_LENGTH - 1; ++j) {
            int index = rand() % (int)(sizeof charset - 1);
            string[j] = charset[index];
        }
        string[MAX_STRING_LENGTH - 1] = '\0';

        printf("%s\n", string);
    }
    
    for(int i = 0; i < n; ++i) {
        free(strings[i]);
    }
    free(strings);

    return 0;
}

No i tutaj wszystko lux, działa. Ale, że w C nie ma referencji, to char*& string musze zamienić na char** string. Jedna gwiazdka, bo to string, druga gwiazdka, bo chce "referencje" do tego stringa. No i ogólnie wtedy jak chce pisać do tego stringa, to musze gwiazdkę przed stringiem żeby zamiast pisać na wskaźnik do stringa, to piszę do stringa.

int main()
{
    int n = 5;
    static const int MAX_STRING_LENGTH = 32;

    char** strings = (char**)malloc(n * sizeof(char*));
    for(int i = 0; i < n; ++i) {
        char** string = &strings[i];
        *string = (char*)malloc(MAX_STRING_LENGTH);

        const char charset[] = "ABCDEFGHIJKLMNOPRSTUWXYZ";
        for(int j = 0; j < MAX_STRING_LENGTH - 1; ++j) {
            int index = rand() % (int)(sizeof charset - 1);
            *string[j] = charset[index];
        }
        *string[MAX_STRING_LENGTH - 1] = '\0';

        printf("%s\n", *string);
    }

    for(int i = 0; i < n; ++i) {
        free(strings[i]);
    }
    free(strings);

    return 0;
}

Moim okiem wygląda to dobrze, ale program wywala się w drugiej iteracji pętli wewnętrznej.

Co zrobiłem tutaj źle?

7

Nie potrzebujesz wskaźnika na wskaźnik.

Poza tym kolejność operatorów [] i * jest inna niż myślisz. l wychodzisz poza zakres n zważywszy na to czym jest zmienna string.

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