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
> 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;
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
> 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
But again why i am able to pass value to char* even if it is not
intialized.
Cheers
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.
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.
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.
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.
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
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>
That can explian this scenario.
Thanks a lot.
Cheers
Vishal
> "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.
"That"? What are you referring to?
"this"? What are you referring to?
Please read <http://cfaj.freeshell.org/google> before you post again.
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>
Incidentally, there's a third instance of undefined behavior here -
anyone know what it is?
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/>
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>.
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]
> 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!
Can demons come out of a flying pig's nose?
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.)
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();
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 and Francis Richmond richmond at plano dot net |
+----------------------------------------------------------------+
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);
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".
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