Почему я получаю ошибку сегментации после преобразования char **? - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь сделать что-то вроде этого:

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]);
}

Я не смог понять, почему перед вызовом test () первая строка написана правильно, но позже я получаю сегментациюнеисправность.В других разделах кода я вызываю test () с argv, и он работает нормально.Почему попытка печати strMat [0] в функции тестирования приводит к ошибке сегментации?

1 Ответ

0 голосов
/ 27 ноября 2018

A char[2][32] - это не char**, а непрерывный блок памяти размером 2 * 32 байта.Это можно выделить, напечатав указатели:

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

Когда вы приводите тип к char**, вы интерпретируете данные, содержащиеся в массиве, как адреса памяти, которые неизбежно ссылаются на недопустимую память.

Действительно, если вы попытаетесь распечатать неверный адрес, который, по вашему мнению, является правильным, например:

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

Вы получите 0x5453524946, что, интерпретируемое как массив байтов, таких как 0x54 0x53 0x52 0x49 0x46, приводит к 'T' 'S' 'R' 'I' 'F' которая показывает проблему (символы поменялись местами, потому что я предполагаю, что у платформы немного порядковый номер).

...