could you help me about this problem?

Discussion in 'C Programming' started by softwindow, Feb 27, 2007.

  1. softwindow

    softwindow Guest

    #include "stdio.h"
    #include "malloc.h"
    struct student{
    int age;
    char *nms;
    struct student *next;
    };
    struct student *create(){
    int ags=0,size=sizeof(struct student);
    char *nms=" ";
    struct student *head=NULL,*tail=NULL,*p=NULL;
    scanf("%d%s",&ags,nms); //-------------------here!!!!!!
    while(ags!=0){
    p=(struct student * )malloc(size);
    nms=(char *)malloc(20);
    p->age=ags;
    p->nms=nms;
    p->next=NULL;
    if(head==NULL){
    head=p;
    }else{
    tail->next=p;
    }
    tail=p;
    scanf("%d%s",&ags,nms);
    }
    return head;
    }
    int main(void) {
    struct student *ptr=create();
    while(ptr){
    printf("%d====%s\n",ptr->age,ptr->nms);
    free(ptr->nms);
    free(ptr);
    ptr=ptr->next;
    }
    }
    ************************************
    i think that is no problem with it.but it doesn't work!
    why?
     
    softwindow, Feb 27, 2007
    #1
    1. Advertising

  2. softwindow

    Dave Hansen Guest

    On Feb 27, 9:25 am, "softwindow" <> wrote:
    [...]
    > free(ptr);
    > ptr=ptr->next;
    > }}
    >
    > ************************************
    > i think that is no problem with it.but it doesn't work!
    > why?


    You didn't give us much of a hint as to what you think "doesn't work"
    means. But one obvious problem is the code above. Once you pass a
    pointer to free, you can't then try to dereference it. Try something
    like

    tptr = ptr->next;
    free(ptr);
    ptr = tptr;

    (with an appropriate declaration of tptr, of course.)

    Regards,
    -=Dave
     
    Dave Hansen, Feb 27, 2007
    #2
    1. Advertising

  3. softwindow

    Manish Guest

    On Feb 27, 10:25 am, "softwindow" <> wrote:
    > #include "stdio.h"
    > #include "malloc.h"
    > struct student{
    > int age;
    > char *nms;
    > struct student *next;};
    >
    > struct student *create(){
    > int ags=0,size=sizeof(struct student);
    > char *nms=" ";
    > struct student *head=NULL,*tail=NULL,*p=NULL;
    > scanf("%d%s",&ags,nms); //-------------------here!!!!!!
    > while(ags!=0){
    > p=(struct student * )malloc(size);
    > nms=(char *)malloc(20);
    > p->age=ags;
    > p->nms=nms;
    > p->next=NULL;
    > if(head==NULL){
    > head=p;
    > }else{
    > tail->next=p;
    > }
    > tail=p;
    > scanf("%d%s",&ags,nms);
    > }
    > return head;}
    >
    > int main(void) {
    > struct student *ptr=create();
    > while(ptr){
    > printf("%d====%s\n",ptr->age,ptr->nms);
    > free(ptr->nms);
    > free(ptr);
    > ptr=ptr->next;
    > }}
    >
    > ************************************
    > i think that is no problem with it.but it doesn't work!

    If there is no problem, then why do you say it doesn't work.

    Sorry, I am not a mind reader, you will have to spell out what exactly
    your issue is.

    > why?
     
    Manish, Feb 27, 2007
    #3
  4. softwindow

    Manish Guest

    On Feb 27, 10:25 am, "softwindow" <> wrote:
    > #include "stdio.h"
    > #include "malloc.h"
    > struct student{
    > int age;
    > char *nms;
    > struct student *next;};
    >
    > struct student *create(){
    > int ags=0,size=sizeof(struct student);
    > char *nms=" ";
    > struct student *head=NULL,*tail=NULL,*p=NULL;
    > scanf("%d%s",&ags,nms); //-------------------here!!!!!!


    What is your input, do you have enough memory allocated for 'nms'?

    > while(ags!=0){
    > p=(struct student * )malloc(size);
    > nms=(char *)malloc(20);
    > p->age=ags;
    > p->nms=nms;
    > p->next=NULL;
    > if(head==NULL){
    > head=p;
    > }else{
    > tail->next=p;
    > }
    > tail=p;
    > scanf("%d%s",&ags,nms);
    > }
    > return head;}
    >
    > int main(void) {
    > struct student *ptr=create();
    > while(ptr){
    > printf("%d====%s\n",ptr->age,ptr->nms);
    > free(ptr->nms);
    > free(ptr);
    > ptr=ptr->next;
    > }}
    >
    > ************************************
    > i think that is no problem with it.but it doesn't work!
    > why?
     
    Manish, Feb 27, 2007
    #4
  5. softwindow

    softwindow Guest

    On 2ÔÂ27ÈÕ, ÏÂÎç11ʱ35·Ö, "Dave Hansen" <> wrote:
    > On Feb 27, 9:25 am, "softwindow" <> wrote:
    > [...]
    >
    > > free(ptr);
    > > ptr=ptr->next;
    > > }}

    >
    > > ************************************
    > > i think that is no problem with it.but it doesn't work!
    > > why?

    >
    > You didn't give us much of a hint as to what you think "doesn't work"
    > means. But one obvious problem is the code above. Once you pass a
    > pointer to free, you can't then try to dereference it. Try something
    > like
    >
    > tptr = ptr->next;
    > free(ptr);
    > ptr = tptr;
    >
    > (with an appropriate declaration of tptr, of course.)
    >
    > Regards,
    > -=Dave


    ******************************************
    i have change code as your code,it is my fault;
    now i find it throw error at the first " scanf("%d
    %s",&ags,nms); //-------------------here
    "
    when i input "10 finy", it throw a error.
     
    softwindow, Feb 27, 2007
    #5
  6. softwindow

    Manish Guest

    On Feb 27, 10:49 am, "softwindow" <> wrote:
    > On 2月27æ—¥, 下åˆ11æ—¶35分, "Dave Hansen" <> wrote:
    >
    >
    >
    >
    >
    > > On Feb 27, 9:25 am, "softwindow" <> wrote:
    > > [...]

    >
    > > >                 free(ptr);
    > > >                 ptr=ptr->next;
    > > >         }}

    >
    > > > ************************************
    > > > i think that is no problem with it.but it doesn't work!
    > > > why?

    >
    > > You didn't give us much of a hint as to what you think "doesn't work"
    > > means.  But one obvious problem is the code above.  Once you pass a
    > > pointer to free, you can't then try to dereference it.  Try something
    > > like

    >
    > >    tptr = ptr->next;
    > >    free(ptr);
    > >    ptr = tptr;

    >
    > > (with an appropriate declaration of tptr, of course.)

    >
    > > Regards,
    > >    -=Dave

    >
    > ******************************************
    > i have change code as your code,it is my fault;
    > now i find it throw error at the first " scanf("%d
    > %s",&ags,nms); //-------------------here
    > "
    > when i input "10 finy", it throw a error.- Hide quoted text -
    >
    > - Show quoted text -


    okay now let's see the '10' gets stored in ags and 'finy' which needs
    5 (4 bytes for "finy" and 1 extra byte for '\0') bytes of storage
    space, you try to store it in 'nms' which has how much space ... ?
    (Ans. 1 byte)
     
    Manish, Feb 27, 2007
    #6
  7. softwindow

    softwindow Guest

    On 2ÔÂ28ÈÕ, ÉÏÎç12ʱ13·Ö, "Manish" <> wrote:
    > On Feb 27, 10:49 am, "softwindow" <> wrote:
    >
    >
    >
    >
    >
    > > On 2ÔÂ27ÈÕ, ÏÂÎç11ʱ35·Ö, "Dave Hansen" <> wrote:

    >
    > > > On Feb 27, 9:25 am, "softwindow" <> wrote:
    > > > [...]

    >
    > > > > free(ptr);
    > > > > ptr=ptr->next;
    > > > > }}

    >
    > > > > ************************************
    > > > > i think that is no problem with it.but it doesn't work!
    > > > > why?

    >
    > > > You didn't give us much of a hint as to what you think "doesn't work"
    > > > means. But one obvious problem is the code above. Once you pass a
    > > > pointer to free, you can't then try to dereference it. Try something
    > > > like

    >
    > > > tptr = ptr->next;
    > > > free(ptr);
    > > > ptr = tptr;

    >
    > > > (with an appropriate declaration of tptr, of course.)

    >
    > > > Regards,
    > > > -=Dave

    >
    > > ******************************************
    > > i have change code as your code,it is my fault;
    > > now i find it throw error at the first " scanf("%d
    > > %s",&ags,nms); //-------------------here
    > > "
    > > when i input "10 finy", it throw a error.- Hide quoted text -

    >
    > > - Show quoted text -

    >
    > okay now let's see the '10' gets stored in ags and 'finy' which needs
    > 5 (4 bytes for "finy" and 1 extra byte for '\0') bytes of storage
    > space, you try to store it in 'nms' which has how much space ... ?
    > (Ans. 1 byte)- Òþ²Ø±»ÒýÓÃÎÄ×Ö -
    >
    > - ÏÔʾÒýÓõÄÎÄ×Ö -


    oh!my god! yes,you are right!
    thanks!
     
    softwindow, Feb 27, 2007
    #7
  8. softwindow

    John Turner Guest

    Manish wrote:
    > "softwindow" <> wrote:
    >> "Dave Hansen" <> wrote:
    >> i have change code as your code,it is my fault;
    >> now i find it throw error at the first " scanf("%d
    >> %s",&ags,nms); //-------------------here
    >> "
    >> when i input "10 finy", it throw a error.
    >>

    >
    > okay now let's see the '10' gets stored in ags and 'finy' which needs
    > 5 (4 bytes for "finy" and 1 extra byte for '\0') bytes of storage
    > space, you try to store it in 'nms' which has how much space ... ?
    > (Ans. 1 byte)
    >



    > char *nms=" ";


    nms doesn't have any storage that he's allowed to write to. It points
    to a string literal.

    See: http://c-faq.com/decl/strlitinit.html

    John
     
    John Turner, Feb 27, 2007
    #8
  9. "Manish" <> writes:
    [...]
    > okay now let's see the '10' gets stored in ags and 'finy' which needs
    > 5 (4 bytes for "finy" and 1 extra byte for '\0') bytes of storage
    > space, you try to store it in 'nms' which has how much space ... ?
    > (Ans. 1 byte)


    The declaration of nms was

    char *nms=" ";

    so nms points to *two* bytes (' ' and '\0'). But, as someone else
    already pointed out, you're not allowed to write to those bytes,
    because they're part of a string literal. (You *might* get away with
    it, but it's undefined behavior.)

    Another comment: white space can make your code easier to read.
    Rather than

    char *nms=" ";

    try:

    char *nms = " ";

    And so on.

    --
    Keith Thompson (The_Other_Keith) <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."
    -- Antony Jay and Jonathan Lynn, "Yes Minister"
     
    Keith Thompson, Feb 27, 2007
    #9
  10. softwindow

    pete Guest

    softwindow wrote:
    >
    > #include "stdio.h"
    > #include "malloc.h"
    > struct student{
    > int age;
    > char *nms;
    > struct student *next;
    > };
    > struct student *create(){
    > int ags=0,size=sizeof(struct student);
    > char *nms=" ";
    > struct student *head=NULL,*tail=NULL,*p=NULL;
    > scanf("%d%s",&ags,nms); //-------------------here!!!!!!
    > while(ags!=0){
    > p=(struct student * )malloc(size);
    > nms=(char *)malloc(20);
    > p->age=ags;
    > p->nms=nms;
    > p->next=NULL;
    > if(head==NULL){
    > head=p;
    > }else{
    > tail->next=p;
    > }
    > tail=p;
    > scanf("%d%s",&ags,nms);
    > }
    > return head;
    > }
    > int main(void) {
    > struct student *ptr=create();
    > while(ptr){
    > printf("%d====%s\n",ptr->age,ptr->nms);
    > free(ptr->nms);
    > free(ptr);
    > ptr=ptr->next;
    > }
    > }


    /* BEGIN new.c */

    #include <stdio.h>
    #include <stdlib.h>

    #define LENGTH 19

    struct student {
    int age;
    char *nms;
    struct student *next;
    };

    struct student *create(void)
    {
    struct student *head = NULL;
    struct student *tail = NULL;
    struct student *p = NULL;
    int ags;
    char *nms;

    do {
    p = malloc(sizeof *p);
    if (p == NULL) {
    puts("p == NULL");
    exit(EXIT_FAILURE);
    }
    p -> next = NULL;
    nms = malloc(LENGTH + 1);
    if (nms == NULL) {
    puts("nms == NULL");
    exit(EXIT_FAILURE);
    }
    if (scanf("%d%s", &ags, nms) != 2) {
    puts("scanf(\"%d%s\", &ags, nms) != 2");
    exit(EXIT_FAILURE);
    }
    p -> age = ags;
    p -> nms = nms;
    if (head == NULL) {
    head = p;
    } else {
    tail -> next = p;
    }
    tail = p;
    } while (ags != 0);
    return head;
    }

    int main(void)
    {
    struct student *next;
    struct student *ptr = create();

    while (ptr != NULL) {
    next = ptr -> next;
    printf("%d====%s\n", ptr -> age, ptr -> nms);
    free(ptr -> nms);
    free(ptr);
    ptr = next;
    }
    return 0;
    }

    /* END new.c */

    --
    pete
     
    pete, Feb 27, 2007
    #10
  11. softwindow

    softwindow Guest

    On 2ÔÂ28ÈÕ, ÉÏÎç5ʱ14·Ö, Keith Thompson <> wrote:
    > "Manish" <> writes:
    >
    > [...]
    >
    > > okay now let's see the '10' gets stored in ags and 'finy' which needs
    > > 5 (4 bytes for "finy" and 1 extra byte for '\0') bytes of storage
    > > space, you try to store it in 'nms' which has how much space ... ?
    > > (Ans. 1 byte)

    >
    > The declaration of nms was
    >
    > char *nms=" ";
    >
    > so nms points to *two* bytes (' ' and '\0'). But, as someone else
    > already pointed out, you're not allowed to write to those bytes,
    > because they're part of a string literal. (You *might* get away with
    > it, but it's undefined behavior.)
    >
    > Another comment: white space can make your code easier to read.
    > Rather than
    >
    > char *nms=" ";
    >
    > try:
    >
    > char *nms = " ";
    >
    > And so on.
    >
    > --
    > Keith Thompson (The_Other_Keith) <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."
    > -- Antony Jay and Jonathan Lynn, "Yes Minister"


    **************************************
    you say "you're not allowed to write to those bytes, because they're
    part of a string literal"

    but i try it,i can write bytes like follow:

    char *nms=" ";
    scanf("%s",nms);

    you can try it.
     
    softwindow, Feb 28, 2007
    #11
  12. softwindow

    Nelu Guest

    softwindow wrote:
    > On 2?28?, ??5?14?, Keith Thompson <> wrote:
    >> "Manish" <> writes:
    >>
    >> [...]
    >>
    >>> okay now let's see the '10' gets stored in ags and 'finy' which needs
    >>> 5 (4 bytes for "finy" and 1 extra byte for '\0') bytes of storage
    >>> space, you try to store it in 'nms' which has how much space ... ?
    >>> (Ans. 1 byte)

    >> The declaration of nms was
    >>
    >> char *nms=" ";
    >>
    >> so nms points to *two* bytes (' ' and '\0'). But, as someone else
    >> already pointed out, you're not allowed to write to those bytes,
    >> because they're part of a string literal. (You *might* get away with
    >> it, but it's undefined behavior.)
    >>
    >> Another comment: white space can make your code easier to read.
    >> Rather than
    >>
    >> char *nms=" ";
    >>
    >> try:
    >>
    >> char *nms = " ";
    >>
    >> And so on.
    >>
    >> --
    >> Keith Thompson (The_Other_Keith) <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."
    >> -- Antony Jay and Jonathan Lynn, "Yes Minister"

    >
    > **************************************
    > you say "you're not allowed to write to those bytes, because they're
    > part of a string literal"
    >
    > but i try it,i can write bytes like follow:
    >
    > char *nms=" ";
    > scanf("%s",nms);
    >
    > you can try it.


    The standard says that the behavior is undefined if you attempt
    to modify such a string. It is possible that *you* can do that
    but that's not something you should rely on.

    --
    Ioan - Ciprian Tandau
    tandau _at_ freeshell _dot_ org (hope it's not too late)
    (... and that it still works...)
     
    Nelu, Feb 28, 2007
    #12
  13. "softwindow" <> writes:
    > On 2ÔÂ28ÈÕ, ÉÏÎç5ʱ14·Ö, Keith Thompson <> wrote:

    [...]
    >> The declaration of nms was
    >>
    >> char *nms=" ";
    >>
    >> so nms points to *two* bytes (' ' and '\0'). But, as someone else
    >> already pointed out, you're not allowed to write to those bytes,
    >> because they're part of a string literal. (You *might* get away with
    >> it, but it's undefined behavior.)

    [...]

    Please trim quoted material. In particular, don't quote signatures
    unless you're actually commenting on them.

    > **************************************
    > you say "you're not allowed to write to those bytes, because they're
    > part of a string literal"
    >
    > but i try it,i can write bytes like follow:
    >
    > char *nms=" ";
    > scanf("%s",nms);
    >
    > you can try it.


    As I write above:

    You *might* get away with it, but it's undefined behavior.

    The most likely results of attempting to modify a string literal are
    (a) your program immediately crashes, or (b) it "works", and the
    string literal is modified.

    Undefined behavior doesn't mean that the system is going to stop you
    from doing it. It means the behavior is undefined; anything can
    happen, so it's entirely up to you to avoid doing it.

    See question 1.32 in the comp.lang.c FAQ, <http://www.c-faq.com/>.

    --
    Keith Thompson (The_Other_Keith) <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."
    -- Antony Jay and Jonathan Lynn, "Yes Minister"
     
    Keith Thompson, Feb 28, 2007
    #13
  14. softwindow <> wrote:
    >char *nms=" ";
    >scanf("%s",nms);
    >
    >you can try it.


    Let me try it... This is what happens when I run the program and type
    'b':

    $ foo
    b
    Segmentation fault

    So it's not exactly working for me. :)

    In addition to what others are saying about the behavior in this
    instance being undefined, the standard says that string literals may be
    in read-only memory, and can actually be shared in memory, for instance:

    #include <stdio.h>

    int main(void)
    {
    char *a = "foobar";
    char *b = "foobar";
    char *c = "frobozz";

    printf("a = %p\n", a);
    printf("b = %p\n", b);
    printf("c = %p\n", c);

    return 0;
    }

    prints the following on my system:

    a = 0x8048524
    b = 0x8048524
    c = 0x804852b

    (Note a and b point to the same place.)

    So, on my system, if it were allowed, modifying a's "foobar" would
    effectively also modify b's; it's probably not what was desired.

    -Beej
     
    Beej Jorgensen, Feb 28, 2007
    #14
  15. Groovy hepcat softwindow was jivin' on 27 Feb 2007 07:25:48 -0800 in
    comp.lang.c.
    could you help me about this problem?'s a cool scene! Dig it!

    >#include "stdio.h"


    That should be:

    #include <stdio.h>

    >#include "malloc.h"


    No such header. It should be:

    #include <stdlib.h>

    >struct student{
    > int age;
    > char *nms;
    > struct student *next;
    >};
    >struct student *create(){
    > int ags=0,size=sizeof(struct student);
    > char *nms=" ";


    Here you create a string literal of one character length, resulting
    in two bytes being allocated (one for your single character, and one
    for the terminating '\0'). This may be placed in memory marked as
    being readable but not writable. String literals are not modifiable.

    > struct student *head=NULL,*tail=NULL,*p=NULL;
    > scanf("%d%s",&ags,nms); //-------------------here!!!!!!


    And here you attempt to read an arbitrarily long string (likely more
    than one character) into the non-modifiable, one character long string
    literal, thus attempting to not only modify a non-modifiable object,
    but actually overflow that, writing to memory you don't own; possibly
    memory that doesn't even exist! BANG! And your program crashes. Or it
    goes on "working", but ends up doing weird things to your hard drive.
    Or it makes demons fly out of your nose.
    Had you read the FAQ list of this newsgroup or simply lurked here
    for a while you would know that scanf() is not the best thing to use
    for interactive input. It is customary, upon first entering a
    newsgroup, to read a month or two of articles (lurk) before posting
    and to seek out and read the newsgroup's FAQ, if it has one. Failing
    to do so before posting is very rude! Please read the FAQ
    (http://www.eskimo.com/~scs/C-faq/top.html) before posting any more.
    What is the user supposed to be enterring anyhow? A prompt would be
    helpful.

    > while(ags!=0){
    > p=(struct student * )malloc(size);


    Don't cast the return from malloc(). Do check the return from
    malloc().

    > nms=(char *)malloc(20);


    Don't cast the return from malloc(). Do check the return from
    malloc().

    > p->age=ags;
    > p->nms=nms;


    Here you copy the address of your string literal to your struct
    member. Thus, your struct member will point to your string literal. No
    other storage has been set aside, and no data copied.

    > p->next=NULL;
    > if(head==NULL){
    > head=p;
    > }else{
    > tail->next=p;


    A bit dodgy! I think it will probably work, since the else clause is
    not executed first time around (because head == NULL first time
    through the loop). But it doesn't look good to dereference tail above
    the point where you actually set it to a useful value..., assuming p
    actually does contain a useful value.

    > }
    > tail=p;
    > scanf("%d%s",&ags,nms);


    And again you attempt to write X characters (where X is some unknown
    number) to a one character long string literal.

    > }
    > return head;
    >}
    >int main(void) {
    > struct student *ptr=create();


    Check the return value. It's always a good idea.

    > while(ptr){
    > printf("%d====%s\n",ptr->age,ptr->nms);
    > free(ptr->nms);


    And here you're trying to free memory that was not allocated by
    malloc(), calloc() or realloc(). BANG! More undefined behaviour! More
    nasal demons! Remember, the nms member of your structure points at a
    string literal.

    > free(ptr);
    > ptr=ptr->next;


    And once again, BANG! You're dereferencing ptr after freeing the
    memory it points at.

    > }


    return 0;

    >}
    >************************************
    >i think that is no problem with it.


    Think again! There are many problems here. There may be some I
    haven't spotted; after all, I only gave your code a cursory look. Even
    so, I still found many serous errors.

    > but it doesn't work!
    >why?


    Because it's so severely broken.

    --

    Dig the even newer still, yet more improved, sig!

    http://alphalink.com.au/~phaywood/
    "Ain't I'm a dog?" - Ronny Self, Ain't I'm a Dog, written by G. Sherry & W. Walker.
    I know it's not "technically correct" English; but since when was rock & roll "technically correct"?
     
    Peter Shaggy Haywood, Feb 28, 2007
    #15
  16. softwindow

    softwindow Guest

    On 2ÔÂ28ÈÕ, ÏÂÎç1ʱ19·Ö, (Peter "Shaggy"
    Haywood) wrote:
    > Groovy hepcat softwindow was jivin' on 27 Feb 2007 07:25:48 -0800 in
    > comp.lang.c.
    > could you help me about this problem?'s a cool scene! Dig it!
    >
    > >#include "stdio.h"

    >
    > That should be:
    >
    > #include <stdio.h>
    >
    > >#include "malloc.h"

    >
    > No such header. It should be:
    >
    > #include <stdlib.h>
    >
    > >struct student{
    > > int age;
    > > char *nms;
    > > struct student *next;
    > >};
    > >struct student *create(){
    > > int ags=0,size=sizeof(struct student);
    > > char *nms=" ";

    >
    > Here you create a string literal of one character length, resulting
    > in two bytes being allocated (one for your single character, and one
    > for the terminating '\0'). This may be placed in memory marked as
    > being readable but not writable. String literals are not modifiable.
    >
    > > struct student *head=NULL,*tail=NULL,*p=NULL;
    > > scanf("%d%s",&ags,nms); //-------------------here!!!!!!

    >
    > And here you attempt to read an arbitrarily long string (likely more
    > than one character) into the non-modifiable, one character long string
    > literal, thus attempting to not only modify a non-modifiable object,
    > but actually overflow that, writing to memory you don't own; possibly
    > memory that doesn't even exist! BANG! And your program crashes. Or it
    > goes on "working", but ends up doing weird things to your hard drive.
    > Or it makes demons fly out of your nose.
    > Had you read the FAQ list of this newsgroup or simply lurked here
    > for a while you would know that scanf() is not the best thing to use
    > for interactive input. It is customary, upon first entering a
    > newsgroup, to read a month or two of articles (lurk) before posting
    > and to seek out and read the newsgroup's FAQ, if it has one. Failing
    > to do so before posting is very rude! Please read the FAQ
    > (http://www.eskimo.com/~scs/C-faq/top.html) before posting any more.
    > What is the user supposed to be enterring anyhow? A prompt would be
    > helpful.
    >
    > > while(ags!=0){
    > > p=(struct student * )malloc(size);

    >
    > Don't cast the return from malloc(). Do check the return from
    > malloc().
    >
    > > nms=(char *)malloc(20);

    >
    > Don't cast the return from malloc(). Do check the return from
    > malloc().
    >
    > > p->age=ags;
    > > p->nms=nms;

    >
    > Here you copy the address of your string literal to your struct
    > member. Thus, your struct member will point to your string literal. No
    > other storage has been set aside, and no data copied.
    >
    > > p->next=NULL;
    > > if(head==NULL){
    > > head=p;
    > > }else{
    > > tail->next=p;

    >
    > A bit dodgy! I think it will probably work, since the else clause is
    > not executed first time around (because head == NULL first time
    > through the loop). But it doesn't look good to dereference tail above
    > the point where you actually set it to a useful value..., assuming p
    > actually does contain a useful value.
    >
    > > }
    > > tail=p;
    > > scanf("%d%s",&ags,nms);

    >
    > And again you attempt to write X characters (where X is some unknown
    > number) to a one character long string literal.
    >
    > > }
    > > return head;
    > >}
    > >int main(void) {
    > > struct student *ptr=create();

    >
    > Check the return value. It's always a good idea.
    >
    > > while(ptr){
    > > printf("%d====%s\n",ptr->age,ptr->nms);
    > > free(ptr->nms);

    >
    > And here you're trying to free memory that was not allocated by
    > malloc(), calloc() or realloc(). BANG! More undefined behaviour! More
    > nasal demons! Remember, the nms member of your structure points at a
    > string literal.
    >
    > > free(ptr);
    > > ptr=ptr->next;

    >
    > And once again, BANG! You're dereferencing ptr after freeing the
    > memory it points at.
    >
    > > }

    >
    > return 0;
    >
    > >}
    > >************************************
    > >i think that is no problem with it.

    >
    > Think again! There are many problems here. There may be some I
    > haven't spotted; after all, I only gave your code a cursory look. Even
    > so, I still found many serous errors.
    >
    > > but it doesn't work!
    > >why?

    >
    > Because it's so severely broken.
    >
    > --
    >
    > Dig the even newer still, yet more improved, sig!
    >
    > http://alphalink.com.au/~phaywood/
    > "Ain't I'm a dog?" - Ronny Self, Ain't I'm a Dog, written by G. Sherry & W. Walker.
    > I know it's not "technically correct" English; but since when was rock & roll "technically correct"?


    thank a lot!

    thanks for your excellent explaining!
     
    softwindow, Feb 28, 2007
    #16
  17. "softwindow" <> writes:
    > On 2ÔÂ28ÈÕ, ÏÂÎç1ʱ19·Ö, (Peter "Shaggy"
    > Haywood) wrote:

    [134 lines deleted]
    >
    > thank a lot!
    >
    > thanks for your excellent explaining!


    There was no need to repeat the whole thing.

    --
    Keith Thompson (The_Other_Keith) <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."
    -- Antony Jay and Jonathan Lynn, "Yes Minister"
     
    Keith Thompson, Feb 28, 2007
    #17
  18. softwindow

    pete Guest

    Keith Thompson wrote:
    >
    > "softwindow" <> writes:
    > > On 2ÔÂ28ÈÕ, ÏÂÎç1ʱ19·Ö, (Peter "Shaggy"
    > > Haywood) wrote:

    > [134 lines deleted]
    > >
    > > thank a lot!
    > >
    > > thanks for your excellent explaining!

    >
    > There was no need to repeat the whole thing.


    Sometimes I do that as a cheap and easy way of saving
    the explanation in my email "Sent box".

    --
    pete
     
    pete, Feb 28, 2007
    #18
  19. softwindow

    Richard Bos Guest

    pete <> wrote:

    > Keith Thompson wrote:
    > >
    > > "softwindow" <> writes:
    > > [134 lines deleted]
    > > >
    > > > thank a lot!
    > > >
    > > > thanks for your excellent explaining!

    > >
    > > There was no need to repeat the whole thing.

    >
    > Sometimes I do that as a cheap and easy way of saving
    > the explanation in my email "Sent box".


    That's all very well for you, but it is anti-social to then continue to
    post it to a newsgroup. All good mail- and news-readers have features to
    save a post without sending it. The saving is not the problem; the
    unsnipped sending is.

    Richard
     
    Richard Bos, Feb 28, 2007
    #19
  20. softwindow

    CBFalconer Guest

    pete wrote:
    > Keith Thompson wrote:
    >> "softwindow" <> writes:
    >>

    .... snip ...
    >>
    >>> thanks for your excellent explaining!

    >>
    >> There was no need to repeat the whole thing.

    >
    > Sometimes I do that as a cheap and easy way of saving
    > the explanation in my email "Sent box".


    Hey, I have a patent on that. Cease and desist immediately, or you
    will hear from my lawyers. (They also work for Microsoft. :)

    --
    Chuck F (cbfalconer at maineline dot net)
    Available for consulting/temporary embedded and systems.
    <http://cbfalconer.home.att.net>
     
    CBFalconer, Feb 28, 2007
    #20
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. John Gagon

    If you could add anything you want

    John Gagon, May 12, 2006, in forum: Java
    Replies:
    55
    Views:
    1,406
    Oliver Wong
    May 25, 2006
  2. Shawn
    Replies:
    8
    Views:
    388
    Shawn
    Sep 21, 2006
  3. Jon Harrop
    Replies:
    2
    Views:
    327
    Roedy Green
    Jul 17, 2007
  4. Alexander
    Replies:
    620
    Views:
    8,264
    Seebs
    Nov 9, 2010
  5. Alexander
    Replies:
    68
    Views:
    1,524
Loading...

Share This Page