C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

pointer to an int array
Goto page 1, 2  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C Language
View previous topic :: View next topic  
Author Message
Neo
Guest





PostPosted: Mon Jan 03, 2005 7:14 am    Post subject: pointer to an int array Reply with quote



Hi Folks,


#include<stdio.h>
int main()
{
int (*p)[10];
int arr[10];
int i;

p = arr; /* <-- compiler warning */
for(i=0; i <= 12; i++){ /* i <=12 delibrately written code */
*((*p) + i) = i;

printf("%dn", p[0][i]);
}

return 0;
}

In the above program compiler is giving following warning

$gcc pointer2array.c
pointer2array.c: In function `main':
pointer2array.c:8: warning: assignment from incompatible pointer type

Why the warning?

O'kay and what is the use of int (*p)[10] type of declaration ?
Does the compiler perform any check on the array bounds?
lets say if i declare int arr[12]...
-Neo


Back to top
Jack Klein
Guest





PostPosted: Mon Jan 03, 2005 7:54 am    Post subject: Re: pointer to an int array Reply with quote



On Mon, 3 Jan 2005 12:44:42 +0530, "Neo" <timeless_illusion (AT) yahoo (DOT) com>
wrote in comp.lang.c:

Quote:
Hi Folks,


#include int main()
{
int (*p)[10];
int arr[10];
int i;

p = arr; /* <-- compiler warning */

The name of an array in an expression, other than when it is the
operand of the 'sizeof' or '&' operators, is converted to a pointer to
its first element. So in the statement above, you are assigning the
address of an int (arr[0]) to a pointer to an array. But arr[0] is an
int, not an array of ints.

Replace with:

p = &arr;

Quote:
for(i=0; i <= 12; i++){ /* i <=12 delibrately written code */
*((*p) + i) = i;

printf("%dn", p[0][i]);
}

return 0;
}

In the above program compiler is giving following warning

$gcc pointer2array.c
pointer2array.c: In function `main':
pointer2array.c:8: warning: assignment from incompatible pointer type

Why the warning?

O'kay and what is the use of int (*p)[10] type of declaration ?
Does the compiler perform any check on the array bounds?
lets say if i declare int arr[12]...

--
Jack Klein
Home: http://JK-Technology.Com
FAQs for
comp.lang.c http://www.eskimo.com/~scs/C-faq/top.html
comp.lang.c++ http://www.parashift.com/c++-faq-lite/
alt.comp.lang.learn.c-c++
http://www.contrib.andrew.cmu.edu/~ajo/docs/FAQ-acllc.html

Back to top
Neo
Guest





PostPosted: Mon Jan 03, 2005 8:31 am    Post subject: Re: pointer to an int array Reply with quote




"Jack Klein" <jackklein (AT) spamcop (DOT) net> wrote

Quote:
On Mon, 3 Jan 2005 12:44:42 +0530, "Neo" wrote in comp.lang.c:

Hi Folks,


#include int main()
{
int (*p)[10];
int arr[10];
int i;

p = arr; /* <-- compiler warning */

The name of an array in an expression, other than when it is the
operand of the 'sizeof' or '&' operators, is converted to a pointer to
its first element. So in the statement above, you are assigning the
address of an int (arr[0]) to a pointer to an array. But arr[0] is an
int, not an array of ints.

Replace with:

p = &arr;


O'kay, dats fine.
if I change the declaration above as :

int (*p)[]; <-- pointer2array.c:12: error: invalid use of array with
unspecified bounds
int arr[10];
p = &arr;
for(i=0; i <= 12; i++){
*((*p) + i) = i;
printf("%dn", p[0][i]);
}

compiler error!
what's the use of array index in the above declaration?
as i can go upto 12 or more...

-Neo



Quote:
for(i=0; i <= 12; i++){ /* i <=12 delibrately written code */
*((*p) + i) = i;

printf("%dn", p[0][i]);
}

return 0;
}

In the above program compiler is giving following warning

$gcc pointer2array.c
pointer2array.c: In function `main':
pointer2array.c:8: warning: assignment from incompatible pointer type

Why the warning?

O'kay and what is the use of int (*p)[10] type of declaration ?
Does the compiler perform any check on the array bounds?
lets say if i declare int arr[12]...

--
Jack Klein
Home: http://JK-Technology.Com
FAQs for
comp.lang.c http://www.eskimo.com/~scs/C-faq/top.html
comp.lang.c++ http://www.parashift.com/c++-faq-lite/
alt.comp.lang.learn.c-c++
http://www.contrib.andrew.cmu.edu/~ajo/docs/FAQ-acllc.html



Back to top
Mark McIntyre
Guest





PostPosted: Mon Jan 03, 2005 11:08 am    Post subject: Re: pointer to an int array Reply with quote

On Mon, 3 Jan 2005 14:01:44 +0530, in comp.lang.c , "Neo"
<timeless_illusion (AT) yahoo (DOT) com> wrote:

Quote:
if I change the declaration above as :

int (*p)[]; <-- pointer2array.c:12: error: invalid use of array with unspecified bounds

compiler error!

yes, its an error

Quote:
what's the use of array index in the above declaration?

none - its an illegal construct

Quote:
as i can go upto 12 or more...

only by invoking undefined behaviour....

Don't do that.
--
Mark McIntyre
CLC FAQ CLC readme: <http://www.ungerhu.com/jxh/clc.welcome.txt>


http://www.newsfeeds.com The #1 Newsgroup Service in the World! 120,000+ Newsgroups
----= East and West-Coast Server Farms - Total Privacy via Encryption =----

Back to top
gooch
Guest





PostPosted: Mon Jan 03, 2005 2:10 pm    Post subject: Re: pointer to an int array Reply with quote

You can index up to whatever value you want. p[1000] is fine. The
result is going to be undefined. In most cases you would get a seg
fault but that may not be the case. You have to do the bounds checking
yourself.

Back to top
Richard Bos
Guest





PostPosted: Mon Jan 03, 2005 3:36 pm    Post subject: Re: pointer to an int array Reply with quote

"gooch" <gooch001 (AT) comcast (DOT) net> wrote:

[ Using Google-Broken-Beta is not an excuse not to show any context.
Learn to use it to quote properly or get a real newsreader. Context
reinstated. ]

Quote:
"Neo" <timeless_illusion (AT) yahoo (DOT) com> wrote:

if I change the declaration above as :

int (*p)[]; <-- pointer2array.c:12: error: invalid use of array with
unspecified bounds
int arr[10];
p = &arr;
for(i=0; i <= 12; i++){
*((*p) + i) = i;
printf("%dn", p[0][i]);
}

compiler error!
what's the use of array index in the above declaration?
as i can go upto 12 or more...

You can index up to whatever value you want. p[1000] is fine. The
result is going to be undefined.

I don't see how you can write those sentences together. The result of
p[10] and over are indeed going to be undefined, which is exactly why
such indices are _not_ fine.

Quote:
In most cases you would get a seg fault but that may not be the case.

If you're lucky, you'll get a segfault. If you're unlucky, you won't see
the segfault, but your customer will. If you're _really_ unlucky,
neither of you will get a segfault, but your program will slowly
scribble over all your customer's data, and he'll sue you. Don't run
over the end of your arrays, not even when you think "it'll be safe,
because you'll get a segfault anyway".

Richard

Back to top
gooch
Guest





PostPosted: Mon Jan 03, 2005 6:19 pm    Post subject: Re: pointer to an int array Reply with quote

"I don't see how you can write those sentences together. ....."

I am not saying it is a good thing or that you should do it, only that
it is not a legal operation.

"If you're lucky, you'll get a segfault. ....."

Again I am not suggesting he assume a segfault will occur, only that he
needs to do the bounds checking himself.

Back to top
Mark McIntyre
Guest





PostPosted: Mon Jan 03, 2005 6:41 pm    Post subject: Re: pointer to an int array Reply with quote

On 3 Jan 2005 10:19:39 -0800, in comp.lang.c , "gooch"
<gooch001 (AT) comcast (DOT) net> wrote:

(contextless stuff)

please read the VERY FIRST THING that richard said in his last post to you.

--
Mark McIntyre
CLC FAQ <http://www.eskimo.com/~scs/C-faq/top.html>
CLC readme: <http://www.ungerhu.com/jxh/clc.welcome.txt>


http://www.newsfeeds.com The #1 Newsgroup Service in the World! 120,000+ Newsgroups
----= East and West-Coast Server Farms - Total Privacy via Encryption =----
Back to top
Keith Thompson
Guest





PostPosted: Mon Jan 03, 2005 8:43 pm    Post subject: Re: pointer to an int array Reply with quote

"gooch" <gooch001 (AT) comcast (DOT) net> writes:
Quote:
You can index up to whatever value you want. p[1000] is fine. The
result is going to be undefined. In most cases you would get a seg
fault but that may not be the case. You have to do the bounds checking
yourself.

(I presume p is an array with fewer than 1001 elements.)

p[1000] is not "fine" in any sense of the word. It is a serious error
that the implementation is not required to diagnose. This can
sometimes have the same visible results as something that's perfectly
legal, but the distinction is critical.

Incidentally, it's not true that "in most cases you would get a seg
fault". Attempting to access an array beyond its bounds is very
likely to refer to some other variable in your program, with
unpredictable results.

Your overall point, that you have to do your own bounds checking
because the implementation won't do it for you, is quite correct; I'm
just (over)reacting to your use of the word "fine".

--
Keith Thompson (The_Other_Keith) [email]kst-u (AT) mib (DOT) org[/email] <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.

Back to top
Stan Milam
Guest





PostPosted: Tue Jan 04, 2005 5:15 am    Post subject: Re: pointer to an int array Reply with quote

Jack Klein wrote:

Quote:
On Mon, 3 Jan 2005 12:44:42 +0530, "Neo" wrote in comp.lang.c:


Hi Folks,


#include int main()
{
int (*p)[10];
int arr[10];
int i;

p = arr; /* <-- compiler warning */


The name of an array in an expression, other than when it is the
operand of the 'sizeof' or '&' operators, is converted to a pointer to
its first element. So in the statement above, you are assigning the
address of an int (arr[0]) to a pointer to an array. But arr[0] is an
int, not an array of ints.

Replace with:

p = &arr;


for(i=0; i <= 12; i++){ /* i <=12 delibrately written code */
*((*p) + i) = i;

printf("%dn", p[0][i]);
}

return 0;
}

In the above program compiler is giving following warning

$gcc pointer2array.c
pointer2array.c: In function `main':
pointer2array.c:8: warning: assignment from incompatible pointer type

Why the warning?

O'kay and what is the use of int (*p)[10] type of declaration ?
Does the compiler perform any check on the array bounds?
lets say if i declare int arr[12]...

Okay, both of you are mistaken. int (*p)[10] is declaring an array of
10 pointers to function that return integers. Not quite the same thing
as either of you are talking about.

--
Regards,
Stan Milam.
-----------------------------------------------------------------------------
Vita Brevis. Carpe Guitarum! - Jamie Kinscherff
-----------------------------------------------------------------------------

Back to top
Neo
Guest





PostPosted: Tue Jan 04, 2005 6:21 am    Post subject: Re: pointer to an int array Reply with quote


"Stan Milam" <stmilam (AT) swbell (DOT) net> wrote

Quote:
Jack Klein wrote:

On Mon, 3 Jan 2005 12:44:42 +0530, "Neo" wrote in comp.lang.c:


Hi Folks,


#include int main()
{
int (*p)[10];
int arr[10];
int i;

p = arr; /* <-- compiler warning */


The name of an array in an expression, other than when it is the
operand of the 'sizeof' or '&' operators, is converted to a pointer to
its first element. So in the statement above, you are assigning the
address of an int (arr[0]) to a pointer to an array. But arr[0] is an
int, not an array of ints.

Replace with:

p = &arr;


for(i=0; i <= 12; i++){ /* i <=12 delibrately written code */
*((*p) + i) = i;

printf("%dn", p[0][i]);
}

return 0;
}

In the above program compiler is giving following warning

$gcc pointer2array.c
pointer2array.c: In function `main':
pointer2array.c:8: warning: assignment from incompatible pointer type

Why the warning?

O'kay and what is the use of int (*p)[10] type of declaration ?
Does the compiler perform any check on the array bounds?
lets say if i declare int arr[12]...

Okay, both of you are mistaken. int (*p)[10] is declaring an array of 10
pointers to function that return integers. Not quite the same thing as
either of you are talking about.

--
Regards,
Stan Milam.
-----------------------------------------------------------------------------
Vita Brevis. Carpe Guitarum! - Jamie Kinscherff
-----------------------------------------------------------------------------

pointers to function???
hmm.... its a pointer to arrary of 10 INTs!
-Neo



Back to top
Jens.Toerring@physik.fu-b
Guest





PostPosted: Tue Jan 04, 2005 8:19 am    Post subject: Re: pointer to an int array Reply with quote

Stan Milam <stmilam (AT) swbell (DOT) net> wrote:
Quote:
Okay, both of you are mistaken. int (*p)[10] is declaring an array of
10 pointers to function that return integers. Not quite the same thing
as either of you are talking about.

Sorry, but no.

int ( *p )[ 10 ];

is a pointer to an array of 10 ints. The parentheses here are needed to
distinguish it from

int *p[ 10 ];

which would be an array of 10 pointers to int. An array of 10 pointers
to functions that return int would be

int ( *p[ 10 ] )( );

Regards, Jens
--
Jens Thoms Toerring ___ [email]Jens.Toerring (AT) physik (DOT) fu-berlin.de[/email]
__________________________ http://www.toerring.de

Back to top
Lawrence Kirby
Guest





PostPosted: Tue Jan 04, 2005 2:07 pm    Post subject: Re: pointer to an int array Reply with quote

On Mon, 03 Jan 2005 12:44:42 +0530, Neo wrote:

Quote:
Hi Folks,


#include int main()
{
int (*p)[10];
int arr[10];
int i;

p = arr; /* <-- compiler warning */
for(i=0; i <= 12; i++){ /* i <=12 delibrately written code */
*((*p) + i) = i;

printf("%dn", p[0][i]);
}

return 0;
}

In the above program compiler is giving following warning

$gcc pointer2array.c
pointer2array.c: In function `main':
pointer2array.c:8: warning: assignment from incompatible pointer type

Why the warning?

Becuase you are trying to assign a value of type int * to a variable of
type int (*)[10]. C doesn't support implicit conversion between these
types. You could write

p = &arr;

but there isn't anything obvious to be gained over defining p as int *.

Quote:
O'kay and what is the use of int (*p)[10] type of declaration ?

You could use this in something like the following

int arr2[5][10];
int (*p2)[10] = arr2;

Then accessing p2[x][y] will access the element arr2[x][y]

Quote:
Does
the compiler perform any check on the array bounds? lets say if i
declare int arr[12]...

C doesn't require any sort of bounds checking from the compiler, and most
don't attempt to.

Lawrence

Back to top
S.Tobias
Guest





PostPosted: Fri Jan 07, 2005 10:31 pm    Post subject: Re: pointer to an int array Reply with quote

Mark McIntyre <markmcintyre (AT) spamcop (DOT) net> wrote:
Quote:
On Mon, 3 Jan 2005 14:01:44 +0530, in comp.lang.c , "Neo"
[email]timeless_illusion (AT) yahoo (DOT) com[/email]> wrote:

if I change the declaration above as :

int (*p)[]; <-- pointer2array.c:12: error: invalid use of array with unspecified bounds

compiler error!

yes, its an error

IMHO I think you're wrong here. `p' is simply a pointer to incomplete type
("array of int of unknown size").

The OP probably hadn't noticed that the error was at different line:
printf("%dn", p[0][i]); //error
Exactly, the offending expression is p[0], because, it gets translated
to:
*(p + 0)
in which the summation cannot be evaluated because `*p' has an incomplete
type (however I fail to explain exactly why, because this expression doesn't
seem to violate any constraints at the "+" operator; could anyone help?).

The above expression can be corrected with:
(*p)[i];
This is interesting, because we seem to apply indirection operator to
pointer to incomplete type (again, this is not a constraint violation,
however it doesn't work with pointers to incomplete struct type; could
someone help explain this please?); but here lvalue `*p', which is
of "array of int" type, is converted to "pointer to int" and points
to its first element, essentially same location as the array itself;
this rule seems to take precedence.


Quote:
what's the use of array index in the above declaration?

Type `int[]' is compatible with `int[10]' and `int[20]',
so `p' could be assigned an address of objects defined as:
int a[15];
int b[80];
double d[10]; //except this object
p = &a;
p = &b;
p = &d; //error
However, since `p' is a pointer to incomplete type, no arithmetic or
comparisons can be made with it.
I think one can describe `p' as a generic pointer to "arrays of int".
I don't know if it could be more useful than that.

Quote:
as i can go upto 12 or more...

only by invoking undefined behaviour....

Yes.

--
Stan Tobias
mailx `echo [email]siXtY (AT) FamOuS (DOT) BedBuG.pAlS.INVA[/email]LID | sed s/[[:upper:]]//g`

Back to top
Lawrence Kirby
Guest





PostPosted: Tue Jan 11, 2005 4:01 pm    Post subject: Re: pointer to an int array Reply with quote

On Fri, 07 Jan 2005 22:31:16 +0000, S.Tobias wrote:

Quote:
Mark McIntyre <markmcintyre (AT) spamcop (DOT) net> wrote:
On Mon, 3 Jan 2005 14:01:44 +0530, in comp.lang.c , "Neo"
[email]timeless_illusion (AT) yahoo (DOT) com[/email]> wrote:

if I change the declaration above as :

int (*p)[]; <-- pointer2array.c:12: error: invalid use of array with unspecified bounds

compiler error!

yes, its an error

IMHO I think you're wrong here. `p' is simply a pointer to incomplete type
("array of int of unknown size").

The OP probably hadn't noticed that the error was at different line:
printf("%dn", p[0][i]); //error
Exactly, the offending expression is p[0], because, it gets translated
to:
*(p + 0)
in which the summation cannot be evaluated because `*p' has an incomplete
type (however I fail to explain exactly why, because this expression doesn't
seem to violate any constraints at the "+" operator; could anyone help?).

In both C90 and C99 the + operator requires a pointer operand to have a
pointer to an object type; an incomplete type is not an object type. This
is a constraint.

Lawrence


Back to top
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C Language All times are GMT
Goto page 1, 2  Next
Page 1 of 2

 
 


Powered by phpBB © 2001, 2006 phpBB Group