Proč mám poruchy segmentace po char ** obsazení?

hlasů
1

Snažím se udělat něco takového:

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

Nebyl jsem schopen přijít na to, proč se před voláním test () první řetězec je správně písemnou, ale později jsem si chybu segmentace. V ostatních částech kódu říkám test () s argv a funguje to dobře. Proto se snaží vytisknout strMat [0] Na základě výsledků testu funkce v chybu segmentace?

Položena 27/11/2018 v 17:58
zdroj uživatelem
V jiných jazycích...                          


1 odpovědí

hlasů
2

char[2][32]Není char**ale souvislý blok 2 * 32 bajtů paměti. To může být zvýrazněny tiskem ukazatelů:

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

Když se donutit typ do A char**interpretovat data obsažená v matici jako paměťových adres, které nevyhnutelně odkazují na neplatné paměti.

Ve skutečnosti, pokud se pokusíte vytisknout neplatnou adresu, kterou pokládá za správnou, například:

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

Dostanete 0x5453524946, což interpretováno jako pole bajtů, jako jsou 0x54 0x53 0x52 0x49 0x46výnosy 'T' 'S' 'R' 'I' 'F', které zobrazuje problém (znaky jsou obráceny, protože já jsem za předpokladu trochu endian platformu).

Odpovězeno 27/11/2018 v 18:06
zdroj uživatelem

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