¿En qué comstackdor debo confiar?

Esto va a ser algo así como una pregunta para novatos, pero estaba tratando de trabajar en un pequeño ejercicio en el lenguaje C (no en C ++ ) y me encontré con algunos problemas.

Digamos que quería usar una matriz dentro de un método cuyo tamaño dependía de uno de los argumentos:

void someFunc(int arSize) { char charArray[arSize]; // DO STUFF ... } 

Cuando bash comstackr esto como un archivo .c dentro de Visual Studio 2013 aparece un error que indica que no se permite un tamaño de matriz no constante. Sin embargo, el mismo código funciona dentro de CodeBlocks en un comstackdor GNU. ¿En qué debería confiar? ¿Es normal que los comstackdores se comporten de manera tan diferente? Siempre pensé que si estás haciendo algo que no le gusta a un comstackdor, no deberías hacerlo en primer lugar porque no es un estándar.

¡Cualquier entrada es útil! Vengo de Antecedentes en Python y estoy tratando de involucrarme más en la progtwigción con Data-Structures y Algorithms.

Mi plataforma es Windows como probablemente puedas decir. Por favor, avíseme si esta pregunta necesita más información antes de poder responderla.

Las matrices de longitud variable ( VLA ) son una característica C99 y Visual Studio hasta hace poco no era compatible con C99 y no estoy seguro si actualmente es compatible con VLA en la última versión. gcc, por otro lado, admite C99 aunque no completamente . gcc admite VLA como una extensión fuera del modo C99 , incluso en C ++ .

Del borrador del estándar C99, sección 6.7.5.2 Array declarators, párrafo 4 :

[…] Si el tamaño es una expresión constante entera y el tipo de elemento tiene un tamaño constante conocido, el tipo de matriz no es un tipo de matriz de longitud variable; de lo contrario, el tipo de matriz es un tipo de matriz de longitud variable.

Debes confiar en los comstackdores que estás usando y que quieres apoyar.

En ese tema en particular: los tamaños de matriz no constantes son válidos en C99, que no es totalmente compatible ni con gcc ni con MSVC (el comstackdor de C / C ++ de Microsoft). gcc , sin embargo, tiene esta característica del estándar implementado incluso fuera del modo C99, mientras que MSVC no.

Depende del estándar particular que su comstackdor de C esté siguiendo.

La característica que desea se llama matriz de longitud variable (VLA) y se introdujo en el estándar C99 .

Tal vez su Visual Studio es compatible con alguna versión anterior del estándar. Tal vez podría configurarlo para admitir una versión posterior.

Observe que usar VLA con un gran tamaño podría ser un mal hábito: los VLA generalmente se asignan en stack, y una stack de marco de llamada generalmente debe tener un tamaño pequeño (unos pocos kilobytes como máximo en los procesadores actuales), especialmente para código kernel o recursivo o funciones multiproceso Es posible que desee asignar calloc (por ejemplo, con calloc ) su matriz si tiene más de mil palabras. Entonces necesitarás free más tarde.

Esta es una extensión de GCC que actúa sobre usted.