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*
============== 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*
==============
"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.
"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
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.
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/>
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*
==============
"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
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*
============== This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics
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
|
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>
|
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...
|
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...
|
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...
|
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...
|
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;
|
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" ?
|
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...
|
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...
|
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
|
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...
|
by: nemocccc |
last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
|
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...
|
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...
|
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...
|
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...
|
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...
|
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,...
| |