Inicialização de vetor sem especificação de tamanho (Linguagem C)

Vejo que isso funfa:

char *str1 = "bla"; char str2[] = "bla"; char str3[] = {'b', 'l', 'a', '\0'};

Então pq isso não funfa tb?

Ele acusa “Initialization makes pointer from integer without a cast”

Alguém poderia me explicar?

Apesar de arrays e ponteiros serem quase a “mesma coisa”, você não consegue usar a sintaxe de inicialização de arrays {v1, v2, v3, …, vn} e atribuir seu retorno para um ponteiro. Entenda que apesar de um array “ser” um ponteiro, ainda assim o array tem um tamanho. O ponteiro do array aponta apenas para a primeira posição do array. Perceba que um array sempre tem um ponteiro que aponta para a primeira posição (o identificador), entretanto um ponteiro nem sempre aponta para o início de um array.

Entendeu o raciocínio?

[]'s

Completando o que o davidbuzatto explicou… PONTEIRO é um CONTROLE REMOTO UNIVERSAL.

char str = {'b', 'l', 'a', '\0'}; // vetor char de tamanho [4] char *p; // CONTROLE REMOTO UNIVERSAL para char p = str; // configura o CONTROLE REMOTO UNIVERSAL para a posção [0] do vetor // é o mesmo que... p = &str[0];

[quote=davidbuzatto]Apesar de arrays e ponteiros serem quase a “mesma coisa”, você não consegue usar a sintaxe de inicialização de arrays {v1, v2, v3, …, vn} e atribuir seu retorno para um ponteiro. Entenda que apesar de um array “ser” um ponteiro, ainda assim o array tem um tamanho. O ponteiro do array aponta apenas para a primeira posição do array. Perceba que um array sempre tem um ponteiro que aponta para a primeira posição (o identificador), entretanto um ponteiro nem sempre aponta para o início de um array.
[/quote]

Oi david! Agradeço a explicação! Mas veja só:

“bla” não é um array? Qual é o ponteiro identificador de “bla”, visto que str é mutável?

Pois é! Mas você não está inicializando o ponteiro como um “array”, mas sim usando o literal para string.
Realmente é estranho, concordo com você, mas essa deve ser a convenção do compilador.
Provalemente isso deve estar descrito na especificação da linguagem C.

[]'s

[quote=cake][quote=davidbuzatto]Apesar de arrays e ponteiros serem quase a “mesma coisa”, você não consegue usar a sintaxe de inicialização de arrays {v1, v2, v3, …, vn} e atribuir seu retorno para um ponteiro. Entenda que apesar de um array “ser” um ponteiro, ainda assim o array tem um tamanho. O ponteiro do array aponta apenas para a primeira posição do array. Perceba que um array sempre tem um ponteiro que aponta para a primeira posição (o identificador), entretanto um ponteiro nem sempre aponta para o início de um array.
[/quote]

Oi david! Agradeço a explicação! Mas veja só:

“bla” não é um array? Qual é o ponteiro identificador de “bla”, visto que str é mutável?
[/quote]

se você quer saber onde foi colocado a primeira posição de “bla” (no caso b) você pode pegar a referência da posição.

int pos = &str;

Note que, como você não “incrementou” o apontador ele aponta para primeira posição(‘b’);
caso você incremente *str++ você passa a segunda posição

dá uma lida nesse artigo. seção 2;

http://cesarakg.freeshell.org/pointers.html