Explicando a diferença entre (char *) e (char []).

Você já deve ter visto códigos com ambas as declarações abaixo:

char *s1 = "fred";
char s2[] = "fred";

Elas parecem ser equivalentes, mas não são!

A primeira declara um ponteiro que aponta para uma região fixa (constante) da memória. A segunda declaração é um array onde o ponteiro s2 aponta para o primeiro elemento, que é colocado no segmento de dados (não read-only). Eia a prova:

#include <stdio.h>

int main(void)
{
  char *s = "fred";

  s[0] = 'd';
  printf("%s\n", s);

  return 0;
}

O código acima compilará, mas ao ser executado você obterá um segmentation fault. Substitua o *s por s[] e obterá a string “dred”…

Anúncios

4 comentários sobre “Explicando a diferença entre (char *) e (char []).

  1. Da hora, o ponteiro *s1 é uma constante estática, é uma variável que é colocado na seção .rodata pelo compilador, que permite apenas leitura, já no segundo exemplo, se não me engano a variável é colocado na seção .data, vlw Frederico, belas explicações.

    1. Você pode entender assim… Mas, na verdade o array “fred” é colocado em .rodata. Como você NÃO está pedindo para o compilador alocar o array, na construção char *s1 = "fred", então ele não tem alternativa senão inicializar s1 com o endereço do array em .rodata… Mas, o ponteiro s1 (a variável s1) estará no segmento .data (ela PODE ser alterada em runtime!).

      No caso de declarar char s2[] = "fred", você diz, explicitamente que s2 é um array que será inicializado com o conteúdo “fred” e, por isso, esse array constante não é colocado em .rodata, mas no próprio array em .data.

Deixe um comentário

Faça o login usando um destes métodos para comentar:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s