Estou analisando o rascunho C2Y n3467 e tentando entender algo envolvendo funções que utilizam VLAs.
Parece haver um comportamento indefinido que não é mencionado pela norma. Ou seja:
- passando uma matriz multidimensional de uma extensão particular para
- um parâmetro de função esperando um, onde
- a definição da função espera uma extensão diferente.
Aqui está meu código demonstrando isso. Embora o comportamento resultante tenha feito sentido, não entendo ( Q :) por que o padrão nunca declarou esse comportamento indefinido/não especificado/definido pela implementação. Nas seções específicas, 6.7.7.3. Array e 6.7.7.4. Declaradores de Função na seção 6.7. Declaração, e 6.9.2. Definições de Função na seção Declarações Externas, a possível UB não é mencionada em nenhum lugar nesses lugares.
#include <stdio.h>
#include <stdlib.h>
extern int d, e;
int g(int z[3][*][*]);
int main()
{
int z[3][d][e];
for(int i=0; i<3; i++)
for(int j=0; j<d; j++)
for(int k=0; k<e; k++)
z[i][j][k] = i*d*e+j*e+k;
int x = g(z);
printf("%zd, %d.\n", sizeof(float[x]), x);
return 0;
}
extern int u, v;
int g(int z[3][v][u])
{
return z[0][2][2];
}
As variáveis externas são definidas assim:
int u = 3, v = 5;
int d = 7, e = 7;
Saída:
32, 8.