473,406 Members | 2,387 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,406 software developers and data experts.

VLA Question

Couple of questions about the following code (playing with variable length
arrays):

#include <stdio.h>
#include <string.h>

void f(int n, char * argv[])
{
again:

{
char c[n++];

// puts(c);

if(strlen(argv[0]) > n + 1)
{
goto again;
}

else

{
strcpy(c, argv[0]);

puts(c);
}
}

return;

}

int main(int argc, char * argv[])
{
f(0, argv);

getchar();

return 0;
}

1. My understanding of vla is that 'c' should be destroyed/recreated each
time I jump to again: This seems to be the case - uncomment the //
puts(c) - with gcc, 'c' indeed contains garbage each time [a bit of a 'risky
test', but worth it I thought].

Anyway, is my understanding correct here, e.g., that the code is working as
the c99 std says it should?

2. If you were to remove the compound statement[ the { before char c[n++];
and the } before the return; ], gcc gives an error:

'syntax error before "char"'

It obviously doesn't like a definition appearing after a label.

That surprised me, and I'm not sure that it's correct, i.e., I haven't yet
found anything in the stds that says this is defined behaviour. Opinions?
--
==============
*Not a pedant*
==============
Feb 23 '06 #1
8 1660
pemo wrote:
Couple of questions about the following code (playing with variable
length arrays):

#include <stdio.h>
#include <string.h>

void f(int n, char * argv[])
{
again:

{
char c[n++];

// puts(c);

if(strlen(argv[0]) > n + 1)
{
goto again;
}

else

{
strcpy(c, argv[0]);

puts(c);
}
}

return;

}

int main(int argc, char * argv[])
{
f(0, argv);

getchar();

return 0;
}

1. My understanding of vla is that 'c' should be destroyed/recreated
each time I jump to again: This seems to be the case - uncomment the
// puts(c) - with gcc, 'c' indeed contains garbage each time [a bit of a
'risky test', but worth it I thought].

Anyway, is my understanding correct here, e.g., that the code is
working as the c99 std says it should?

2. If you were to remove the compound statement[ the { before char
c[n++]; and the } before the return; ], gcc gives an error:

'syntax error before "char"'

It obviously doesn't like a definition appearing after a label.

That surprised me, and I'm not sure that it's correct, i.e., I
haven't yet found anything in the stds that says this is defined
behaviour. Opinions?


Duh, that should have been something more like ...

{
char c[n++];

puts(c);

c[0] = 'Z';

gcc seemingly preserves the contents [mostly].

BN+w=?@ <- initial entry: garbage.
ZN+w=?@ <- after initial c[0] = 'Z': mostly garbage.
->= <- hmmm
Z>= <- Zs from here on in: mostly garbage.
Z>=
Z>=
Z>=
Z>= -- "" --
Z>=
Z>=
Z>=
Z>=
Z>=
vla <- after the strcpy.
--
==============
*Not a pedant*
==============
Feb 23 '06 #2
"pemo" <us***********@gmail.com> writes:
[snip]
2. If you were to remove the compound statement[ the { before char c[n++];
and the } before the return; ], gcc gives an error:

'syntax error before "char"'

It obviously doesn't like a definition appearing after a label.

That surprised me, and I'm not sure that it's correct, i.e., I haven't yet
found anything in the stds that says this is defined behaviour. Opinions?


I know the answer to that, but there's no way I can explain it without
being a pedant, and I know how much you hate that. Sorry.

--
Keith Thompson (The_Other_Keith) ks***@mib.org <http://www.ghoti.net/~kst>
San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
We must do something. This is something. Therefore, we must do this.
Feb 23 '06 #3
"pemo" <us***********@gmail.com> writes:
pemo wrote:
Couple of questions about the following code (playing with variable
length arrays):

#include <stdio.h>
#include <string.h>

void f(int n, char * argv[])
{
again:

{
char c[n++];

// puts(c);

if(strlen(argv[0]) > n + 1)
{
goto again;
}

else

{
strcpy(c, argv[0]);

puts(c);
}
}

return;

}

int main(int argc, char * argv[])
{
f(0, argv);

getchar();

return 0;
}

1. My understanding of vla is that 'c' should be destroyed/recreated
each time I jump to again: This seems to be the case - uncomment the
// puts(c) - with gcc, 'c' indeed contains garbage each time [a bit of a
'risky test', but worth it I thought].

Anyway, is my understanding correct here, e.g., that the code is
working as the c99 std says it should?
Yes. The lifetiem of a VLA extends from its declaration to the end of
the block.

2. If you were to remove the compound statement[ the { before char
c[n++]; and the } before the return; ], gcc gives an error:

'syntax error before "char"'

It obviously doesn't like a definition appearing after a label.

That surprised me, and I'm not sure that it's correct, i.e., I
haven't yet found anything in the stds that says this is defined
behaviour. Opinions?

This is one of the known differences between the way intermixed
declarations/statements work in C and how they work in C++. In C++, a
declaration can be a statement, in its own right. In C, declarations
are still not statements; they just can appear with statements in any
order within a complex statement.

To make it work, you can use a null statement...

again:
;
char c[n++];

<what follows is your response to your own message>:
Duh, that should have been something more like ...

{
char c[n++];

puts(c);

c[0] = 'Z';

gcc seemingly preserves the contents [mostly].

BN+w=?@ <- initial entry: garbage.
ZN+w=?@ <- after initial c[0] = 'Z': mostly garbage.
->= <- hmmm
Z>= <- Zs from here on in: mostly garbage.
Z>=
Z>=
Z>=
Z>= -- "" --
Z>=
Z>=
Z>=
Z>=
Z>=
vla <- after the strcpy.


Of course, you realize that running the code like that at all is quite
undefined behavior. Really, at the very least you should set an
element to '\0'.

-Micah
Feb 24 '06 #4
pemo schrieb:
Couple of questions about the following code (playing with variable length
arrays):

#include <stdio.h>
#include <string.h>

void f(int n, char * argv[])
{
again:

{
char c[n++];

// puts(c);

if(strlen(argv[0]) > n + 1)
ITYM strlen(argv[0]) + 1 > n
{
goto again;
}

else

{
strcpy(c, argv[0]);

puts(c);
}
}

return;

}

int main(int argc, char * argv[])
{
f(0, argv);

getchar();

return 0;
}

1. My understanding of vla is that 'c' should be destroyed/recreated each
time I jump to again: This seems to be the case - uncomment the //
puts(c) - with gcc, 'c' indeed contains garbage each time [a bit of a 'risky
test', but worth it I thought].

Anyway, is my understanding correct here, e.g., that the code is working as
the c99 std says it should?

2. If you were to remove the compound statement[ the { before char c[n++];
and the } before the return; ], gcc gives an error:

'syntax error before "char"'

It obviously doesn't like a definition appearing after a label.

That surprised me, and I'm not sure that it's correct, i.e., I haven't yet
found anything in the stds that says this is defined behaviour. Opinions?


Have a look at the C99 grammar.
Declarations are not statements, but labels have to precede statements.
You can try the very same with case labels...

Cheers
Michael
--
E-Mail: Mine is an /at/ gmx /dot/ de address.
Feb 24 '06 #5
Keith Thompson wrote:
.... snip ...
I know the answer to that, but there's no way I can explain it
without being a pedant, and I know how much you hate that. Sorry.


Laughing all the way to the bank.

--
"If you want to post a followup via groups.google.com, don't use
the broken "Reply" link at the bottom of the article. Click on
"show options" at the top of the article, then click on the
"Reply" at the bottom of the article headers." - Keith Thompson
More details at: <http://cfaj.freeshell.org/google/>
Also see <http://www.safalra.com/special/googlegroupsreply/>
Feb 24 '06 #6
Michael Mair wrote:
pemo schrieb:
Couple of questions about the following code (playing with variable
length arrays):

#include <stdio.h>
#include <string.h>

void f(int n, char * argv[])
{
again:

{
char c[n++];

// puts(c);

if(strlen(argv[0]) > n + 1)
ITYM strlen(argv[0]) + 1 > n
{
goto again;
}

else

{
strcpy(c, argv[0]);

puts(c);
}
}

return;

}

int main(int argc, char * argv[])
{
f(0, argv);

getchar();

return 0;
}

1. My understanding of vla is that 'c' should be destroyed/recreated
each time I jump to again: This seems to be the case - uncomment
the // puts(c) - with gcc, 'c' indeed contains garbage each time [a bit
of
a 'risky test', but worth it I thought].

Anyway, is my understanding correct here, e.g., that the code is
working as the c99 std says it should?

2. If you were to remove the compound statement[ the { before char
c[n++]; and the } before the return; ], gcc gives an error:

'syntax error before "char"'

It obviously doesn't like a definition appearing after a label.

That surprised me, and I'm not sure that it's correct, i.e., I
haven't yet found anything in the stds that says this is defined
behaviour. Opinions?


Have a look at the C99 grammar.
Declarations are not statements, but labels have to precede
statements. You can try the very same with case labels...


Have a look at the C99 grammar.
Declarations are not statements, but labels have to precede
statements. You can try the very same with case labels...


Yes thanks, I fathomed this out just after I posted!
ITYM strlen(argv[0]) + 1 > n


Nice catch, thanks.
--
==============
*Not a pedant*
==============
Feb 24 '06 #7

"pemo" <us***********@gmail.com> wrote in message
news:dt**********@news.ox.ac.uk...
Michael Mair wrote:
pemo schrieb:
Couple of questions about the following code (playing with variable
length arrays):

#include <stdio.h>
#include <string.h>

void f(int n, char * argv[])
{
again:

{
char c[n++];

// puts(c);

if(strlen(argv[0]) > n + 1)


ITYM strlen(argv[0]) + 1 > n
{
goto again;
}

else

{
strcpy(c, argv[0]);

puts(c);
}
}

return;

}

int main(int argc, char * argv[])
{
f(0, argv);

getchar();

return 0;
}
[snip]
Yes thanks, I fathomed this out just after I posted!
ITYM strlen(argv[0]) + 1 > n


Nice catch, thanks.

And moreover, the definition needs to be char c[++n] not n++, or you're
still a byte short

--
RSH
Feb 24 '06 #8
Robin Haigh wrote:
"pemo" <us***********@gmail.com> wrote in message
news:dt**********@news.ox.ac.uk...
Michael Mair wrote:
pemo schrieb:
Couple of questions about the following code (playing with variable
length arrays):

#include <stdio.h>
#include <string.h>

void f(int n, char * argv[])
{
again:

{
char c[n++];

// puts(c);

if(strlen(argv[0]) > n + 1)

ITYM strlen(argv[0]) + 1 > n

{
goto again;
}

else

{
strcpy(c, argv[0]);

puts(c);
}
}

return;

}

int main(int argc, char * argv[])
{
f(0, argv);

getchar();

return 0;
}
[snip]

Yes thanks, I fathomed this out just after I posted!
ITYM strlen(argv[0]) + 1 > n


Nice catch, thanks.

And moreover, the definition needs to be char c[++n] not n++, or
you're still a byte short


Ta - that's me, one byte short of a full array!

--
==============
*Not a pedant*
==============
Feb 24 '06 #9

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

1
by: Mohammed Mazid | last post by:
Can anyone please help me on how to move to the next and previous question? Here is a snippet of my code: Private Sub cmdNext_Click() End Sub Private Sub cmdPrevious_Click() showrecord
3
by: Stevey | last post by:
I have the following XML file... <?xml version="1.0"?> <animals> <animal> <name>Tiger</name> <questions> <question index="0">true</question> <question index="1">true</question> </questions>
7
by: nospam | last post by:
Ok, 3rd or is it the 4th time I have asked this question on Partial Types, so, since it seems to me that Partial Types is still in the design or development stages at Microsoft, I am going to ask...
3
by: Ekqvist Marko | last post by:
Hi, I have one Access database table including questions and answers. Now I need to give answer id automatically to questionID column. But I don't know how it is best (fastest) to do? table...
10
by: glenn | last post by:
I am use to programming in php and the way session and post vars are past from fields on one page through to the post page automatically where I can get to their values easily to write to a...
10
by: Rider | last post by:
Hi, simple(?) question about asp.net configuration.. I've installed ASP.NET 2.0 QuickStart Sample successfully. But, When I'm first start application the follow message shown. ========= Server...
53
by: Jeff | last post by:
In the function below, can size ever be 0 (zero)? char *clc_strdup(const char * CLC_RESTRICT s) { size_t size; char *p; clc_assert_not_null(clc_strdup, s); size = strlen(s) + 1;
56
by: spibou | last post by:
In the statement "a *= expression" is expression assumed to be parenthesized ? For example if I write "a *= b+c" is this the same as "a = a * (b+c)" or "a = a * b+c" ?
2
by: Allan Ebdrup | last post by:
Hi, I'm trying to render a Matrix question in my ASP.Net 2.0 page, A matrix question is a question where you have several options that can all be rated according to several possible ratings (from...
3
by: Zhang Weiwu | last post by:
Hello! I wrote this: ..required-question p:after { content: "*"; } Corresponding HTML: <div class="required-question"><p>Question Text</p><input /></div> <div...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...
0
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.