Por que eu recebo uma falha de segmentação após char ** elenco?

votos
1

Eu estou tentando fazer algo como isto:

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

Eu não tenho sido capaz de descobrir por que antes de chamar test () a primeira corda está escrito corretamente, mas depois eu recebo uma falha de segmentação. Em outras seções do código que eu chamo de teste () com argv e funciona bem. Por que tentar imprimir strMat [0] sobre a função de teste resulta em uma falha de segmentação?

Publicado 27/11/2018 em 17:58
fonte usuário
Em outras línguas...                          


1 respostas

votos
2

Um char[2][32]não é um char**mas um bloco contíguo de 2 * 32 bytes de memória. Isto pode ser destacado por impressão dos ponteiros:

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

Quando você coagir o tipo a um char**você interpretar os dados contidos na matriz como endereços de memória que inevitavelmente se referem a memória inválido.

De fato, se você tentar imprimir o endereço inválido que você assume é correto, por exemplo:

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

Você começa 0x5453524946, que, interpretado como uma matriz de bytes como 0x54 0x53 0x52 0x49 0x46, os rendimentos 'T' 'S' 'R' 'I' 'F'que mostra a questão (os personagens são revertidas porque eu estou assumindo uma plataforma endian pouco).

Respondeu 27/11/2018 em 18:06
fonte usuário

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