Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Help in c pointers

1 view
Skip to first unread message

manoch...@gmail.com

unread,
Feb 28, 2006, 4:54:12 AM2/28/06
to

HI

int *p;
*p = 4;

char * msg;
*msg = 'c';

printf("msg is %s",msg);


when i try to pass a value 4 to place what integer pointer p points to
it says seg fault

but for the char pointer it works fine.

Why this behaviour

Help

Zero

unread,
Feb 28, 2006, 5:03:37 AM2/28/06
to

manoch...@gmail.com schrieb:

> int *p;
> *p = 4;

You have done the greates programming fault when using pointers.
Never use a pointer when it points somewhere!

Better try this:

int * p;

p = (int *) malloc (sizeof(int));

*p = 4;

manoch...@gmail.com

unread,
Feb 28, 2006, 5:11:29 AM2/28/06
to
hi,

Thanx for the quick reply.

In here i am concerned why while using char * i am able to pass value
to it. Even this points to somewhere right.
So while using int * which points somwhere i am not able to pass value
to it but while using the char * i am able to do it . Why???
Thanx in advance

A. Sinan Unur

unread,
Feb 28, 2006, 5:11:36 AM2/28/06
to
"Zero" <chefm...@web.de> wrote in news:1141121017.828706.126940
@e56g2000cwe.googlegroups.com:

> manoch...@gmail.com schrieb:
>
>> int *p;
>> *p = 4;
>
> You have done the greates programming fault when using pointers.
> Never use a pointer when it points somewhere!

ITYM: Never use a pointer if it does *not* point to anywhere (that is,
never use an uninitialized pointer.

> Better try this:
>
> int * p;
>
> p = (int *) malloc (sizeof(int));
>
> *p = 4;

Better not. There is no need to cast the return value of malloc, and
doing so can hide errors. Always, yes *always*, check that malloc
succeeded:

int *p = malloc(sizeof *p);
if ( p ) {
*p = 4;
} else {
/* handle error */
}

Sinan
--
A. Sinan Unur <1u...@llenroc.ude.invalid>
(reverse each component and remove .invalid for email address)

comp.lang.perl.misc guidelines on the WWW:
http://mail.augustmail.com/~tadmc/clpmisc/clpmisc_guidelines.html

Zero

unread,
Feb 28, 2006, 5:15:19 AM2/28/06
to
if you have a char,
it must be
printf("%c", *msg);

manoch...@gmail.com

unread,
Feb 28, 2006, 5:15:39 AM2/28/06
to
Hi,
Thanx

But again why i am able to pass value to char* even if it is not
intialized.

Cheers

Keith Thompson

unread,
Feb 28, 2006, 5:27:13 AM2/28/06
to
"manoch...@gmail.com" <manoch...@gmail.com> writes:
> int *p;
> *p = 4;

p is uninitialized. Attempting to dereference it invokes undefined
behavior.

> char * msg;
> *msg = 'c';

msg is uninitialized. Attempting to dereference it invokes undefined
behavior.

> printf("msg is %s",msg);
>
>
> when i try to pass a value 4 to place what integer pointer p points to
> it says seg fault
>
> but for the char pointer it works fine.

Both are possible consequences of undefined behavior.

--
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.

A.A

unread,
Feb 28, 2006, 5:27:26 AM2/28/06
to
Because you 're luck.

Keith Thompson

unread,
Feb 28, 2006, 5:30:39 AM2/28/06
to
"manoch...@gmail.com" <manoch...@gmail.com> writes:
> But again why i am able to pass value to char* even if it is not
> intialized.

Please read <http://cfaj.freeshell.org/google/>.

If I understand your question, it's because you're invoking undefined
behavior, which can do anything. See the response I posted a few
minutes ago on the "about the array" thread.

pranav.c...@gmail.com

unread,
Feb 28, 2006, 5:30:49 AM2/28/06
to

1. I think it is just a coincidence that you are not getting the error
for char *.
2. Maybe your program terminates on line 2 and u never know if there
was a SEG_FAULT in line 4
3. AFAIK chances for seg_fault is more for integers as their size is
larger.

Keith Thompson

unread,
Feb 28, 2006, 5:33:46 AM2/28/06
to
"A.A" <auto...@gmail.com> writes:
> Because you 're luck.

Ok, *everybody* who's reading this through Google, run, do not walk,
to <http://cfaj.freeshell.org/google/>. Read it. Understand it.
Do this before you post here again. Please.

manoch...@gmail.com

unread,
Feb 28, 2006, 5:57:43 AM2/28/06
to
Hi keith,

Can u recommend me soem of the advance C books. I have gone thru Expert
C programming. Some book on similiar line sbut with multi threading and
algorithms.

Thanx in advance

Cheers
Vishal

Pedro Graca

unread,
Feb 28, 2006, 6:17:06 AM2/28/06
to

When you start your program imagine your memory looks like

0x65 0x39 0x82 0x87 0x46 0x53 0x72 0x99 0x27 0x34 ... <== garbage

You then say `p' is a pointer to int

0x65 0x39 0x82 0x87 0x46 0x53 0x72 0x99 0x27 0x34 ... <== garbage
`-------------------' <== p, pointing to garbage

and `msg' is a pointer to char

0x65 0x39 0x82 0x87 0x46 0x53 0x72 0x99 0x27 0x34 ... <== garbage
`-------------------' <== msg, pointing to garbage


Apparently the garbage `p' points to is not writable whereas the garbage
`msg' points to is.

--
If you're posting through Google read <http://cfaj.freeshell.org/google>

manoch...@gmail.com

unread,
Feb 28, 2006, 6:28:40 AM2/28/06
to
Yes,

That can explian this scenario.

Thanks a lot.

Cheers
Vishal

A. Sinan Unur

unread,
Feb 28, 2006, 6:58:50 AM2/28/06
to
Keith Thompson <ks...@mib.org> wrote in
news:ln64mz3...@nuthaus.mib.org:

> "A.A" <auto...@gmail.com> writes:
>> Because you 're luck.
>
> Ok, *everybody* who's reading this through Google, run, do not walk,
> to <http://cfaj.freeshell.org/google/>. Read it. Understand it.
> Do this before you post here again. Please.

Too late. The thread has already become worse than useless with insanely
meaningless posts.

Pedro Graca

unread,
Feb 28, 2006, 8:17:05 AM2/28/06
to
manoch...@gmail.com wrote:
> That can explian this scenario.
^^^^ ^^^^

"That"? What are you referring to?
"this"? What are you referring to?

Please read <http://cfaj.freeshell.org/google> before you post again.

Kenneth Brody

unread,
Feb 28, 2006, 10:09:13 AM2/28/06
to

Neither pointer has been initialized, and both assignments invoke UB. In
your particular case, the address in p happened to be invalid for an int,
and the address in msg happened to be valid for a char, and didn't cause
any noticable effect by overwriting that memory.

--
+-------------------------+--------------------+-----------------------------+
| Kenneth J. Brody | www.hvcomputer.com | |
| kenbrody/at\spamcop.net | www.fptech.com | #include <std_disclaimer.h> |
+-------------------------+--------------------+-----------------------------+
Don't e-mail me at: <mailto:ThisIsA...@gmail.com>


Jordan Abel

unread,
Feb 28, 2006, 12:03:28 PM2/28/06
to
On 2006-02-28, Kenneth Brody <kenb...@spamcop.net> wrote:
> "manoch...@gmail.com" wrote:
>>
>> HI
>>
>> int *p;
>> *p = 4;
>>
>> char * msg;
>> *msg = 'c';
>>
>> printf("msg is %s",msg);
>>
>> when i try to pass a value 4 to place what integer pointer p points to
>> it says seg fault
>>
>> but for the char pointer it works fine.
>>
>> Why this behaviour
>
> Neither pointer has been initialized, and both assignments invoke UB. In
> your particular case, the address in p happened to be invalid for an int,
> and the address in msg happened to be valid for a char, and didn't cause
> any noticable effect by overwriting that memory.

Incidentally, there's a third instance of undefined behavior here -
anyone know what it is?

CBFalconer

unread,
Feb 28, 2006, 10:20:41 AM2/28/06
to

You were unlucky with the char pointer.

Neither p nor msg points anywhere. Trying to dereference either of
them results in undefined behavior. Undefined behaviour includes
"working". It also includes launching flying pigs.

--
"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/>


Pedro Graca

unread,
Feb 28, 2006, 2:17:13 PM2/28/06
to
Jordan Abel wrote:
> On 2006-02-28, Kenneth Brody <kenb...@spamcop.net> wrote:
>> "manoch...@gmail.com" wrote:
>>> int *p;
>>> *p = 4;
>>>
>>> char * msg;
>>> *msg = 'c';
>>>
>>> printf("msg is %s",msg);
>>
>> Neither pointer has been initialized, and both assignments invoke UB.
>
> Incidentally, there's a third instance of undefined behavior here -
> anyone know what it is?

a) `msg' isn't (*) a c-string (a sequence of chars ending in NUL) so
passing it to printf invokes UB.

b) printf doesn't end with a newline nor is followed by a
fflush(stdout); invoking implementation defined behaviour (???)


(*) probably it is -- there probably is a nul between msg and msg+<some
large integer value>.

Jordan Abel

unread,
Feb 28, 2006, 2:29:10 PM2/28/06
to
On 2006-02-28, Pedro Graca <hex...@dodgeit.com> wrote:
> Jordan Abel wrote:
>> On 2006-02-28, Kenneth Brody <kenb...@spamcop.net> wrote:
>>> "manoch...@gmail.com" wrote:
>>>> int *p;
>>>> *p = 4;
>>>>
>>>> char * msg;
>>>> *msg = 'c';
>>>>
>>>> printf("msg is %s",msg);
>>>
>>> Neither pointer has been initialized, and both assignments invoke UB.
>>
>> Incidentally, there's a third instance of undefined behavior here -
>> anyone know what it is?
>
> a) `msg' isn't (*) a c-string (a sequence of chars ending in NUL) so
> passing it to printf invokes UB.

Not quite - msg isn't a valid pointer at all, so the act itself of
passing it to printf invokes UB. It would equally invoke UB if it were a
void * and being passed to a printf %p format.

The value of msg is indeterminate since it is never initialized. Reading
an indeterminate value results in undefined behavior [since it may be a
trap representation]

Herbert Rosenau

unread,
Feb 28, 2006, 3:31:21 PM2/28/06
to
On Tue, 28 Feb 2006 10:57:43 UTC, "manoch...@gmail.com"
<manoch...@gmail.com> wrote:

> Hi keith,
>
> Can u recommend me soem of the advance C books.

I don't know who u is. Why does you ask us if u knows it? Ask
she/he/it
yourself! Maybe u will answer you, maybe not. I've never seen a
message from Mr./Ms./Mrs. u in usenet at all.

I have gone thru Expert
> C programming. Some book on similiar line sbut with multi threading and
> algorithms.

Mr. google is your friend on that question.

--
Tschau/Bye
Herbert

Visit http://www.ecomstation.de the home of german eComStation
eComStation 1.2 Deutsch ist da!

patel...@gmail.com

unread,
Feb 28, 2006, 4:12:58 PM2/28/06
to
hum nice ?
yar i dont know why u got error
but i cant give eroor
*p=4
mins u asign a adress of value 4 to p there no address of 4
but in charector every char have a fix address.
so may be because of this u get error for int & not for charector.ok.

Kenneth Brody

unread,
Feb 28, 2006, 4:03:23 PM2/28/06
to
CBFalconer wrote:
[...]

> Neither p nor msg points anywhere. Trying to dereference either of
> them results in undefined behavior. Undefined behaviour includes
> "working". It also includes launching flying pigs.

Can demons come out of a flying pig's nose?

Keith Thompson

unread,
Feb 28, 2006, 5:28:02 PM2/28/06
to

Please make some effort to write in standard English. Silly
abbreviations like "u" for "you" just make what you write more
difficult to read. We'll gladly make allowances for minor errors,
especially if English isn't your first language, but I can't even
figure out what you mean.

You also need to provide context when you post a followup. Read
<http://cfaj.freeshell.org/google/> to find out how to do this.

(And the original question has already been answered.)

Pedro Graca

unread,
Feb 28, 2006, 6:17:07 PM2/28/06
to
Jordan Abel wrote:
> On 2006-02-28, Pedro Graca <hex...@dodgeit.com> wrote:
>> Jordan Abel wrote:
>>> On 2006-02-28, Kenneth Brody <kenb...@spamcop.net> wrote:
>>>> "manoch...@gmail.com" wrote:
>>>>> int *p;
>>>>> *p = 4;
>>>>>
>>>>> char * msg;
>>>>> *msg = 'c';
>>>>>
>>>>> printf("msg is %s",msg);
>>>>
>>>> Neither pointer has been initialized, and both assignments invoke UB.
>>>
>>> Incidentally, there's a third instance of undefined behavior here -
>>> anyone know what it is?
>>
>> a) `msg' isn't (*) a c-string (a sequence of chars ending in NUL) so
>> passing it to printf invokes UB.
>
> Not quite - msg isn't a valid pointer at all, so the act itself of
> passing it to printf invokes UB. It would equally invoke UB if it were a
> void * and being passed to a printf %p format.

I understand.

But another question gets raised in my head:
What is a valid pointer?


Examples:

char * p; /* p is, for now, an invalid pointer */

p = &p; /* and now??? */
p = (char*)&p; /* and now??? */
p = main;
p = (char*)main;
p = rand();
p = (char*)rand();

Keith Thompson

unread,
Feb 28, 2006, 6:28:50 PM2/28/06
to
Pedro Graca <hex...@dodgeit.com> writes:
[...]

> But another question gets raised in my head:
> What is a valid pointer?
>
>
> Examples:
>
> char * p; /* p is, for now, an invalid pointer */
>
> p = &p; /* and now??? */
> p = (char*)&p; /* and now??? */

In the above two cases, p is a valid pointer; it points to the first
byte of p.

> p = main;

Illegal. A conversion from a pointer-to-function type to a
pointer-to-object type requires a cast.

> p = (char*)main;

Legal (I think), but undefined. The language does not define the
semantics of a conversion from a pointer-to-function type to a
pointer-to-object type.

> p = rand();

Illegal. There is no implicit conversion from int to char*; a cast is
required.

> p = (char*)rand();

This is legal, but the result of converting an int value to char* is
implementation-defined (except for the special case of a null pointer
constant). The value of p may or may not be valid.

Charles Richmond

unread,
Feb 28, 2006, 7:36:33 PM2/28/06
to
Because what you have done is *wrong* and you get "undefined behavior".
Undefined behavior can range from nasal demons to actually working
occasionally. Undefined behavior means *anything* can happen.

--
+----------------------------------------------------------------+
| Charles and Francis Richmond richmond at plano dot net |
+----------------------------------------------------------------+

Pedro Graca

unread,
Feb 28, 2006, 8:17:02 PM2/28/06
to
[Jordan's comment on passing an invalid pointer to printf inserted]

Keith Thompson wrote:
> Pedro Graca <hex...@dodgeit.com> writes:


>>Jordan Abel wrote [edited]:
>>> the act itself of passing an invalid pointer to printf invokes UB.


>> What is a valid pointer?

[snip examples]


>> p = (char*)rand();
>
> This is legal, but the result of converting an int value to char* is
> implementation-defined (except for the special case of a null pointer
> constant). The value of p may or may not be valid.
>

So the following code does not invoke UB?

char * p;
p = (char*)rand();
printf("%c\n", p);

... and removing the assignment does?

char * p;
printf("%c\n", p);

Keith Thompson

unread,
Feb 28, 2006, 9:19:05 PM2/28/06
to
Pedro Graca <hex...@dodgeit.com> writes:
> [Jordan's comment on passing an invalid pointer to printf inserted]
>
> Keith Thompson wrote:
>> Pedro Graca <hex...@dodgeit.com> writes:
>
>
>>>Jordan Abel wrote [edited]:
>>>> the act itself of passing an invalid pointer to printf invokes UB.
>
>
>>> What is a valid pointer?
> [snip examples]
>>> p = (char*)rand();
>>
>> This is legal, but the result of converting an int value to char* is
>> implementation-defined (except for the special case of a null pointer
>> constant). The value of p may or may not be valid.
>>
>
> So the following code does not invoke UB?
>
> char * p;
> p = (char*)rand();
> printf("%c\n", p);

You need "%p", not "%c". Actually, the "%p" format expects a void*;
you can almost certainly get away with passing a char* instead, but
IMHO it's better style to convert it:

printf("%p\n", (void*)p);

C99 6.3.2.3p5:

An integer may be converted to any pointer type. Except as
previously specified, the result is implementation-defined, might
not be correctly aligned, might not point to an entity of the
referenced type, and might be a trap representation.

The "previously specified" part refers to null pointer constants.
Alignment shouldn't be an issue for char*, but you could still get a
trap representation. If so, evaluating p, whether you then pass the
value to printf() or not, invokes undefined behavior.

> ... and removing the assignment does?
>
> char * p;
> printf("%c\n", p);

That certainly invokes UB, even with "%p".

manoch...@gmail.com

unread,
Mar 1, 2006, 5:28:59 AM3/1/06
to

Even i agree with Keith. Please use some proper English words as this
group is in public domain. Each one here is trying to figure out what
others write and provide a logical solution to it.

Hindi words like 'yar' should not be used here.

Hope you got the point.

Cheers
Vishal

0 new messages