Deutsch   English   Français   Italiano  
<vo9u0u$i0n8$1@dont-email.me>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!eternal-september.org!.POSTED!not-for-mail
From: Janis Papanagnou <janis_papanagnou+ng@hotmail.com>
Newsgroups: comp.lang.c
Subject: Re: Two questions on arrays with size defined by variables
Date: Sun, 9 Feb 2025 10:54:36 +0100
Organization: A noiseless patient Spider
Lines: 88
Message-ID: <vo9u0u$i0n8$1@dont-email.me>
References: <vo9mns$gsd7$1@dont-email.me> <vo9nn3$gtph$1@dont-email.me>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 7bit
Injection-Date: Sun, 09 Feb 2025 10:54:38 +0100 (CET)
Injection-Info: dont-email.me; posting-host="4527279b24ca6f6754d4b39b537bfbcd";
	logging-data="590568"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX1/jmie7PvSbm5yVpTtN03tx"
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101
 Thunderbird/45.8.0
Cancel-Lock: sha1:UNVsOdIUbKyq9eKHs4+ghWDQrnU=
X-Enigmail-Draft-Status: N1110
In-Reply-To: <vo9nn3$gtph$1@dont-email.me>
Bytes: 3399

On 09.02.2025 09:06, Andrey Tarasevich wrote:
> On Sat 2/8/2025 11:50 PM, Janis Papanagnou wrote:
>> I've found examples on the Net where the arrays have been defined in a
>> function context and the size passed as parameter
>>
>>    f(int n) {
>>       char * arr[n];
>>       ...
>>    }
> 
> Yes, that would be a VLA.
> 
>> That reminded me on other languages where you'd need at least a block
>> context for dynamically sized arrays, like
>>
>>    int n = 5;
>>    {
>>       char * arr[n];
>>       ...
>>    }
> 
> But a function body is in itself a block. Inside a function body you are
> already in "a block context".
> 
>> Anyway. I tried it without function or block context
>>
>>    int n = 5;
>>    char * arr[n];
>>    ...
>>
>> and it seemed to work seamlessly like that (with GNU cc, -std=C99).
> 
> You mean you did this at file scope? No, VLAs are illegal at file scope.
> And I was unable to repeat this feat in GCC.

Oh, sorry, no; above I had just written an excerpt. - Actually I had
those two examples above within a main() function. - Sorry again for
my inaccuracy.

What I meant was (with surrounding context) that I knew (from _other_
languages) a syntax like

main ()
{
  int n = 5;

  {
     char * arr[n];
     ...
  }
}

And in "C" (C99) I tried it *without* the _inner block_

main ()
{
  int n = 5;
  char * arr[n];
  ...
}

and it seemed to work that way. (In those other languages that wasn't
possible.)

> 
>> Q1: Is this a correct (portable) form?
> 
> VLA objects have to be declared locally. However, keep in mind that
> support for local declarations of VLA _objects_ is now optional (i.e.
> not portable). Support for variably-modified _types_ themselves (VLA
> types) is mandatory. But you are not guaranteed to be able to declare an
> actual VLA variable.

I fear I don't understand what you're saying here. - By "now" do you
mean newer versions of the C standards? That you can rely only, say,
rely on it with C99 but maybe not before and not in later C standards
conforming compilers?

For my purpose it would be okay to know whether with the C99 version
(that I used) it's okay, or whether that's some GNU specific extension
or some such.

Janis

> 
>> [...]