Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > Pointers to Arrays

Reply
Thread Tools

Pointers to Arrays

 
 
kelvSYC
Guest
Posts: n/a
 
      10-10-2003
I have a declaration of a pointer to an array of a struct as follows:

struct foo (*a)[];

And I have an array of a struct as follows:

struct foo b[];

However, a = &b returns an error (illegal assignment to constant).


Why is this? Is it because the dimensions to b are not defined?

--
I am only a mirage.
 
Reply With Quote
 
 
 
 
Chris Torek
Guest
Posts: n/a
 
      10-10-2003
In article <091020032212534304%(E-Mail Removed)>
kelvSYC <kelvSYC> writes:
>I have a declaration of a pointer to an array of a struct as follows:
>struct foo (*a)[];
>And I have an array of a struct as follows:
>struct foo b[];
>However, a = &b returns an error (illegal assignment to constant).
>Why is this? Is it because the dimensions to b are not defined?


If so, that would be a compiler bug. But I suspect the above is
not *quite* what you have (although "array of unknown size" *is*
not very useful, hence not used much, hence one should suspect
compilers might be buggy in this area).

GCC (under -ansi -pedantic) is perfectly happy with the following,
which is not proof, but is some evidence that it is OK:

% cat /tmp/t.c
struct foo;
struct foo (*a)[];
extern struct foo b[];
void f(void) {
a = &b;
}
% cc -ansi -pedantic -W -Wall -O -c t.c
%

The variable "a" has type "pointer to array ? of struct foo", where
"?" represents "unknown size". (Some prefer to write this as
"pointer to array of ? `struct foo's".) Note that there is absolutely
nothing you can do with the variable "a" that you could not do more
simply with another variable:

struct foo *a1 = *a;

Now you can replace any occurrence of (*a)[i] with a1[i], and any
occurrence of *a with plain a1. The only thing the pointer in "a"
would give you that a1 would not is the ability to write a[h][i]
for some integer h, but with the size of the arrays to which "a"
points unspecified, so the only valid value for "h" is an integer
constant zero: a[0][i], which is the same as (*a)[i].
--
In-Real-Life: Chris Torek, Wind River Systems (BSD engineering)
Salt Lake City, UT, USA (4039.22'N, 11150.29'W) +1 801 277 2603
email: forget about it http://67.40.109.61/torek/index.html (for the moment)
Reading email is like searching for food in the garbage, thanks to spammers.
 
Reply With Quote
 
 
 
 
Vijay Kumar R Zanvar
Guest
Posts: n/a
 
      10-10-2003

"kelvSYC" <(E-Mail Removed)> wrote in message
news:091020032212534304%(E-Mail Removed).. .
> I have a declaration of a pointer to an array of a struct as follows:
>
> struct foo (*a)[];
>


The dimension, here, is not required. It is just a template
which is required by the compiler to know what /a/ is pointing
at.

> And I have an array of a struct as follows:
>
> struct foo b[];
>


Dimension is required. If you have b already defined somewhere
then use

extern struct foo[];

> However, a = &b returns an error (illegal assignment to constant).
>
>
> Why is this? Is it because the dimensions to b are not defined?
>


 
Reply With Quote
 
James Hu
Guest
Posts: n/a
 
      10-10-2003
On 2003-10-10, kelvSYC <(E-Mail Removed)> wrote:
> I have a declaration of a pointer to an array of a struct as follows:
> struct foo (*a)[];
> And I have an array of a struct as follows:
> struct foo b[];
> However, a = &b returns an error (illegal assignment to constant).
> Why is this? Is it because the dimensions to b are not defined?


In fact, both the declartions of a and b need to have dimensions, and
they need to be the same number.

This is needed so that b is the same type as what a is declared to be
pointing at.

-- James
 
Reply With Quote
 
Dave Thompson
Guest
Posts: n/a
 
      10-20-2003
On Fri, 10 Oct 2003 00:36:42 -0500, James Hu <(E-Mail Removed)>
wrote:

> On 2003-10-10, kelvSYC <(E-Mail Removed)> wrote:
> > I have a declaration of a pointer to an array of a struct as follows:
> > struct foo (*a)[];
> > And I have an array of a struct as follows:
> > struct foo b[];
> > However, a = &b returns an error (illegal assignment to constant).
> > Why is this? Is it because the dimensions to b are not defined?

>
> In fact, both the declartions of a and b need to have dimensions, and
> they need to be the same number.
>

No they don't. If at file scope, the declaration of b is actually a
tentative definition; if not overridden, it allocates an array of one
element, initialized to appropriate zeros. But even if you add
'extern' to prevent this, array of unknown bound is compatible with
any fixed bound, and so AFAICT pointers to same can safely be assigned
or equivalent. In C99 this is also true at compile time for any VLA
bound, although it is UB if the actual runtime bounds disagree.

> This is needed so that b is the same type as what a is declared to be
> pointing at.
>

It appears to technically be a violation (UB) to *access* through a
pointer to array of the wrong bound, although in practice it will
almost certainly work as long as any element(s) actually accessed
is(are) within the actual array object. But if you convert (cast, or
assign or equivalent) back to pointer to correct bound it must work.

You won't be able to do arithmetic on, or (thus) subscript, the
pointer to unknown bound, of course.

- David.Thompson1 at worldnet.att.net
 
Reply With Quote
 
James Hu
Guest
Posts: n/a
 
      10-20-2003
On 2003-10-20, Dave Thompson <(E-Mail Removed)> wrote:
> On Fri, 10 Oct 2003 00:36:42 -0500, James Hu <(E-Mail Removed)>
> wrote:
>
>> In fact, both the declartions of a and b need to have dimensions, and
>> they need to be the same number.
>>

> No they don't. [...]
>


Thank you. I was actually straightened out after reading Chris Torek's
post.

-- James
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
pointers, pointers, pointers... cerr C Programming 12 04-07-2011 11:17 PM
casting pointers/arrays to multidimensional arrays Francesco C++ 2 11-06-2009 09:04 AM
Multidimensional arrays and arrays of arrays Philipp Java 21 01-20-2009 08:33 AM
Learning pointers and arrays of pointers With Files ketema@gmail.com C Programming 1 03-28-2005 03:51 AM
Arrays and Pointers to Arrays kelvSYC C Programming 2 09-26-2003 06:52 AM



Advertisments