473,378 Members | 1,639 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,378 software developers and data experts.

variable length array (was: question about dynamic memory allocation)

Hi,

I decided to start a new topic about my memory allocation question. One
of the answers was that variable length arrays are possible using C99. I
found this topic that also mentions it.

http://groups.google.com/group/comp....335d22d6e6fb34

I did some test, but I get strange results:

int size_array = sizeof(struct ip) + cnf->msg_length;
unsigned char packet[size_array];

And then, when asking the size of the 'packet' variable I get 4. How is
that? It should be another number (31).. but I guess i'm getting the
size of type unsigned char. Right?
Thanks,

FBM
Nov 15 '05 #1
8 1853
Fernando Barsoba wrote:
I decided to start a new topic about my memory allocation question. One
of the answers was that variable length arrays are possible using C99. I
found this topic that also mentions it.

http://groups.google.com/group/comp....335d22d6e6fb34
I did some test, but I get strange results:

int size_array = sizeof(struct ip) + cnf->msg_length;
unsigned char packet[size_array];

And then, when asking the size of the 'packet' variable I get 4. How is
that? It should be another number (31).. but I guess i'm getting the
size of type unsigned char. Right?

Technically there's no way to tell, because we don't know what system
you're compiling this on.

That said, you're probably getting the size of an unsigned char*, to
which `packet' decays.

If sizeof packet != size_array after the declarations above, your
compiler does not conform to the C99 standard. gcc in particular does
not support VLAs; it supports an earlier gcc extension that is similar
but not identical to C99 VLAs.

S.
Nov 15 '05 #2
Fernando Barsoba wrote:
Hi,

I decided to start a new topic about my memory allocation question. One
of the answers was that variable length arrays are possible using C99. I
found this topic that also mentions it.

http://groups.google.com/group/comp....335d22d6e6fb34
I did some test, but I get strange results:

int size_array = sizeof(struct ip) + cnf->msg_length;
unsigned char packet[size_array];

And then, when asking the size of the 'packet' variable I get 4. How is
that? It should be another number (31).. but I guess i'm getting the
size of type unsigned char. Right?


Show us the code you used to test.
[You passed `packet' to a function, didn't you...]

HTH,
--ag

--
Artie Gold -- Austin, Texas
http://goldsays.blogspot.com (new post 8/5)
http://www.cafepress.com/goldsays
"If you have nothing to hide, you're not trying!"
Nov 15 '05 #3
Artie Gold wrote:
Fernando Barsoba wrote:
Hi,

I decided to start a new topic about my memory allocation question. One
of the answers was that variable length arrays are possible using C99. I
found this topic that also mentions it.

http://groups.google.com/group/comp....335d22d6e6fb34
I did some test, but I get strange results:

int size_array = sizeof(struct ip) + cnf->msg_length;
unsigned char packet[size_array];

And then, when asking the size of the 'packet' variable I get 4. How is
that? It should be another number (31).. but I guess i'm getting the
size of type unsigned char. Right?


Show us the code you used to test.
[You passed `packet' to a function, didn't you...]


I pass 'packet' to a function later on.. but not for this test. I
checked the size of 'packet' after
unsigned char packet[size_array];

and there's where I get the value 4.

Regarding to the other question, I'm using Eclipse + CDT (and the
compiler is the one that comes with Cygwin which I am using too).

FBM
Nov 15 '05 #4
Fernando Barsoba <fb******@verizon.net> writes:
[snip]
I did some test, but I get strange results:

int size_array = sizeof(struct ip) + cnf->msg_length;
unsigned char packet[size_array];

And then, when asking the size of the 'packet' variable I get 4. How is
that? It should be another number (31).. but I guess i'm getting the
size of type unsigned char. Right?


No, sizeof(unsigned char) is 1 by definition. It looks like it could
be sizeof(unsigned char*), but that's not

How exactly did you ask the size of the 'packet' variable? Show us
some code.

Here's an example that works properly with gcc 2.95.2, 3.4.4, and
4.0.2:

#include <stdio.h>
int main(void)
{
int len = 42;
char vla[len];
printf("sizeof vla = %d\n", (int)sizeof vla);
return 0;
}

The output is:

sizeof vla = 42

If you passed it as an argument to a function and applied sizeof to
the parameter, you'd get the size of the pointer, but that's because
array expressions decay to pointers in most contexts; if you apply
sizeof directly to the array object, it doesn't decay and you get the
size of the array.

--
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.
Nov 15 '05 #5
On Thu, 10 Nov 2005 00:31:56 GMT, Fernando Barsoba
<fb******@verizon.net> wrote:
Hi,

I decided to start a new topic about my memory allocation question. One
of the answers was that variable length arrays are possible using C99. I
found this topic that also mentions it.

http://groups.google.com/group/comp....335d22d6e6fb34

I did some test, but I get strange results:

int size_array = sizeof(struct ip) + cnf->msg_length;
unsigned char packet[size_array];

And then, when asking the size of the 'packet' variable I get 4. How is
that? It should be another number (31).. but I guess i'm getting the
size of type unsigned char. Right?


Not likely. An unsigned char is guaranteed to have a size of one.
<<Remove the del for email>>
Nov 15 '05 #6
Keith Thompson wrote:
Fernando Barsoba <fb******@verizon.net> writes:
[snip]
I did some test, but I get strange results:

int size_array = sizeof(struct ip) + cnf->msg_length;
unsigned char packet[size_array];

And then, when asking the size of the 'packet' variable I get 4. How is
that? It should be another number (31).. but I guess i'm getting the
size of type unsigned char. Right?

No, sizeof(unsigned char) is 1 by definition. It looks like it could
be sizeof(unsigned char*), but that's not

How exactly did you ask the size of the 'packet' variable? Show us
some code.

Here's an example that works properly with gcc 2.95.2, 3.4.4, and
4.0.2:

<snip>
And there's me badmouthing gcc about not supporting VLAs yet. At least
this part works. :-)

S.
Nov 15 '05 #7
Fernando Barsoba <fb******@verizon.net> writes:
Artie Gold wrote:
Fernando Barsoba wrote: [snip]
I did some test, but I get strange results:

int size_array = sizeof(struct ip) + cnf->msg_length;
unsigned char packet[size_array];

And then, when asking the size of the 'packet' variable I get 4. How is
that? It should be another number (31).. but I guess i'm getting
the size of type unsigned char. Right?
Show us the code you used to test.
[You passed `packet' to a function, didn't you...]


I pass 'packet' to a function later on.. but not for this test. I
checked the size of 'packet' after
>>unsigned char packet[size_array];

and there's where I get the value 4.


That shouldn't be happening.

Show us the code you used to test. That means posting a complete
self-contained program that we can compile and run ourselves, along
with the exact output that it gave you. Without that, we really can't
help.
Regarding to the other question, I'm using Eclipse + CDT (and the
compiler is the one that comes with Cygwin which I am using too).


Cygwin comes with gcc (version 3.4.4 if you've updated it recently).

--
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.
Nov 15 '05 #8
Keith Thompson wrote:
Fernando Barsoba <fb******@verizon.net> writes:
Artie Gold wrote:
Fernando Barsoba wrote: [snip]

Show us the code you used to test.
[You passed `packet' to a function, didn't you...]

I pass 'packet' to a function later on.. but not for this test. I
checked the size of 'packet' after
>>unsigned char packet[size_array];

and there's where I get the value 4.


That shouldn't be happening.

Show us the code you used to test. That means posting a complete
self-contained program that we can compile and run ourselves, along
with the exact output that it gave you. Without that, we really can't
help.


Ok, I tested the following code:

#include <stdio.h>
#include <stdlib.h>
#include <netinet/ip.h>
int main(int argc, char **argv) {

int size_array = sizeof(struct ip) + 11;
unsigned char packet[size_array];
// unsigned char ipheader_cpy[sizeof(struct ip)];

printf("Result for sizeof(packet) is: %d", sizeof(packet));
exit(0);

}

And I got as a result:
$ ./Test.exe
Result for sizeof(packet) is: 31

So, I think I have to assume that it's working correctly. The problem is
that I'm using Eclipse/CDT and the debugger seems to have problems with
this kind of code (with VL Arrays). It showed me the '4' that I was
referring to, in the debugging perspective/window from Eclipse... I
thought the problem was with the code, but all you made me focus on the
test.. I guess I relied too much on the debugger...sigh..

Thanks,

FBM
Regarding to the other question, I'm using Eclipse + CDT (and the
compiler is the one that comes with Cygwin which I am using too).


Cygwin comes with gcc (version 3.4.4 if you've updated it recently).

Nov 15 '05 #9

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

Similar topics

12
by: Tan Thuan Seah | last post by:
Hi all, I was told this in one of the university course I was doing. In C we may expect good performance for: double a, c, d; for (i=0; i<N; i++) for(j=0; j<N; j++) a = a + c *d;
5
by: dam_fool_2003 | last post by:
Hai, I studied that the array size is fixed. But I come across a word called "variable length array". Is it possible to change the array size? So I tried the following: #include<stdio.h>...
19
by: Skybuck Flying | last post by:
Hi, I think I might have just invented the variable bit cpu :) It works simply like this: Each "data bit" has a "meta data bit". The meta data bit describes if the bit is the ending bit...
7
by: heddy | last post by:
I have an array of objects. When I use Array.Resize<T>(ref Object,int Newsize); and the newsize is smaller then what the array was previously, are the resources allocated to the objects that are...
16
by: John | last post by:
Does the length of my C variable names have any affect, performance-wise, on my final executable program? I mean, once compiled, etc., is there any difference between these two: number = 3; n =...
53
by: fdmfdmfdm | last post by:
This is an interview question and I gave out my answer here, could you please check for me? Q. What are the memory allocation for static variable in a function, an automatic variable and global...
1
by: Peterwkc | last post by:
Hello all expert, i have two program which make me desperate bu after i have noticed the forum, my future is become brightness back. By the way, my problem is like this i the first program was...
27
by: aravind | last post by:
Hi, I need to develop a menu system for a project of mine. The menu will be displayed on a character LCD display driven by ARM7 Microcontroller. For this purpose i wish to construct a structure in...
8
by: Andrew Smallshaw | last post by:
I'm working on a data structure that began life as a skip list derivative, but has evolved to the point that it now only has a passing resemblance to them. Each node of this structure has a few...
1
by: CloudSolutions | last post by:
Introduction: For many beginners and individual users, requiring a credit card and email registration may pose a barrier when starting to use cloud servers. However, some cloud server providers now...
0
by: Faith0G | last post by:
I am starting a new it consulting business and it's been a while since I setup a new website. Is wordpress still the best web based software for hosting a 5 page website? The webpages will be...
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 3 Apr 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome former...
0
by: taylorcarr | last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
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
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...

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.