Warum erhalte ich einen Segmentation Fault nach char ** Besetzung?

stimmen
1

Ich versuche, so etwas zu tun:

int main()
{
    char strMat[][32] = { {FIRST}, {SECOND}, };
    printf (%s\n, strMat[0]);
    test ((char **) strMat);
    return 0;
}

void test (char **strMat)
{
    printf (%s\n, strMat[0]);
}

Ich habe nicht in der Lage gewesen, herauszufinden, warum vor dem Test () aufrufen, die erste Saite richtig geschrieben ist, aber später habe ich einen Segmentation Fault bekommen. In anderen Abschnitten Code aufrufen I-Test () mit argv und es funktioniert gut. Warum versucht strMat [0] auf der Testfunktion führt zu einem Segmentierungsfehler zu drucken?

Veröffentlicht am 27/11/2018 um 17:58
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
2

A char[2][32]ist kein anderes char**als ein zusammenhängender Block von 2 * 32 Byte Speicher. Dies kann durch den Druck der Zeiger hervorgehoben werden:

printf("%p %p %p\n", strMat[0], &strMat[0], &strMat[1]);

Wenn Sie den Typ auf eine coerce char**interpretieren Sie die in dem Array enthaltenen Daten als Speicheradressen , die unvermeidlich auf ungültige Speicher beziehen.

In der Tat, wenn Sie versuchen, die ungültige Adresse zu drucken, die Sie davon ausgehen, richtig sind, zB:

printf("%p\n", ((char**)strMat)[0]);

Sie erhalten 0x5453524946, die, wie ein Array von Bytes wie interpretiert 0x54 0x53 0x52 0x49 0x46, Ausbeuten , 'T' 'S' 'R' 'I' 'F'die die Ausgabe zeigt (die Zeichen umgekehrt werden , weil ich ein wenig Endian - Plattform vorausgesetzt).

Beantwortet am 27/11/2018 um 18:06
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more