Scanf() string pointer problem


 
Thread Tools Search this Thread
Top Forums Programming Scanf() string pointer problem
# 1  
Old 11-14-2013
Scanf() string pointer problem

I have a problem with scanf() for string pointer as member of a struct.
Code:
#include <stdio.h>
#include <stdlib.h>

struct Student {
    int studentNumber;
    int phoneNumber;
    char *studentName;                       //line 7
// char studentName[20];                   //line 8
};

int main()
{
    struct Student *list;
    int numOfStudents;
    int x;
    int studentCounter = 1;
    
    printf("\nEnter the number of students you would like to input: ");
    scanf("%d", &numOfStudents);
    
    list = malloc(sizeof(list) * numOfStudents);                   //line 21
    
    for (x = 0; x < numOfStudents; x++) {
        printf("\nEnter name for student #%d: ", studentCounter);
        scanf("%s", list[x].studentName);                   //line 25
        printf("Enter student number for student #%d: ",
               studentCounter);
        scanf("%d", &list[x].studentNumber);                   //line 27
        printf("Enter phone number for student #%d: ",
               studentCounter);
        scanf("%d", &list[x].phoneNumber);                   //line 29
        studentCounter++;
    }   

    for (x = 0; x < numOfStudents; x++) {
        printf("%s, #%d, %d: \n", list[x].studentName, list[x].studentNumber, list[x].phoneNumber);
    }   
    
    return 0;
}

No error/warning to compile, but just did not work with "Segment fault!" error.
I believe the problem is with Line 7 and Line 25. If Line 8 is used, everything is fine. I am aware Line 7 does not allocate any memory for studentName, but Line 8 does. How do I solve this problem? Googled for a while, seems a common problem, but I'm still unclear with the right solution. Can anyone please explain it? Thanks a lot!
# 2  
Old 11-14-2013
char *studentName; is a pointer to a string. What does it point to? Absolutely nothing and nowhere in particular. It might point to invalid memory and crash immediately. It might point to somewhere in your own stack frame, causing it to crash later in fascinating nondeterministic ways.

The correct solution would be to either
1) Use line 8
2) Point it to valid memory with a line like list[x].studentName=malloc(20);

Last edited by Corona688; 11-14-2013 at 12:16 PM..
This User Gave Thanks to Corona688 For This Post:
# 3  
Old 11-14-2013
malloc to scanf() string

Thanks Corona688!

I had thought Line 21 covers the allocation of studentName.
Code:
list[x].studentName=malloc(20);

I tried putting this line after Line 25, compiled fine, but did not work. Segment fault! again.
I am trying to use pointer. Where should I put this line for the correct way, not only to make the program run?
Thanks a lot again.
# 4  
Old 11-14-2013
Just before line 25 - you need to have the memory allocated before you try and use it in scanf.

EDIT: Line 21 will allocate space for the pointer itself, but not any memory for the pointer to point at.
This User Gave Thanks to CarloM For This Post:
# 5  
Old 11-14-2013
Thanks Carlo! It worked out very well! How stupid I was to put that after Line 25!!!
One more question about free(list[x].studentName). As this variable is within the loop for memory allcation, and will be used for later print. How do I free it in this case? I am confused because of the loop and as member of the struct, which is a array pointer. Handling malloc() is my worst part with C!
Thank you again!
# 6  
Old 11-14-2013
Right now you're not freeing anything, which is... kind of okay... the same way its okay, if sloppy, to not close open files. It all goes away when the program ends anyway. But if you were doing that 10,000 times in a loop you'd be using 10,000 times as much memory which could definitely be a Bad Thing.

How to free it? As soon as you don't need any of that array anymore, do this:

Code:
for (x = 0; x < numOfStudents; x++) { free(list[x].studentName); }
free(list);

# 7  
Old 11-14-2013
free malloc()

Thanks Corona688!
I tried putting your lines before return 0, it was compiled fine and ran. But after printing it gave many errors:
Code:
*** glibc detected *** ./ch1016c: double free or corruption (out): 0x0000000001423030 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x7eb96)[0x7fe24e2f3b96]
./ch1016c[0x4007ec]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x7fe24e29676d]
./ch1016c[0x400539]
======= Memory map: ========
00400000-00401000 r-xp 00000000 08:01 87823294 
......

To fully understand what is happening here, I tried two ways to free the memory. One is within the printf() loop I freed list[x].studentName at Line 35. My understanding is: Once it has been printed, no needed any more and, free it. Then Line 38 free(list) for the struct;
The other is by putting a separate loop Line 37 to free(list[x].studentName). Then the same Line 38 free(list) as list is the struct;
Code:
 ........
for (x = 0; x < numOfStudents; x++) {
         printf("%s, #%d, %d: \n", list[x].studentName, list[x].studentNumber, list[x].phoneNumber);
 //        free(list[x].studentName);                                          //Line 35
      }
 for (x = 0; x < numOfStudents; x++) { free(list[x].studentName); }          //Line 37
         free(list);                                                          //Line 38
    return 0;
 }

Both had the same problem. Not sure Line 35 is a correct way.
Is Line 35 a correct way to do it?
Is Line 37 the only way to do it when handling 10~100 millions rows?
But both had error. What did I miss? Thanks a lot!
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Programming

String pointer does not work

Hello, I am trying to reverse complement one string and reverse another (NO complement!), both with pointer. My code compiled without error, but did not do the job I wanted. #include <stdio.h> #include <stdlib.h> #include <zlib.h> #include "kseq.h" // STEP 1: declare the type of file... (5 Replies)
Discussion started by: yifangt
5 Replies

2. Programming

How i use pointer as a string in c programing?

I'm newbie learner. My all friend use windows just only me use linux. so i can't solve any problem by myself. i need a solution. how can i use pointer as a string. #include<string.h> #include<stdio.h> int main() { char *s='\0'; gets(s); puts(s); return 0; } This code work on... (6 Replies)
Discussion started by: raihan004
6 Replies

3. Programming

pointer problem

Does anyone know? int x = 1; int *p = &++x; //ok ! int *q = &x++; //gives an error :O why the first pointer is ok but the second is an error? (13 Replies)
Discussion started by: nishrestha
13 Replies

4. Programming

segfault in pointer to string program

hello all, my question is not about How code can be rewritten, i just wanna know even though i am not using read only memory of C (i have declared str) why this function gives me segfault :wall:and the other code executes comfortably though both code uses same pointer arithmetic. ... (4 Replies)
Discussion started by: zius_oram
4 Replies

5. Programming

pass a pointer-to-pointer, or return a pointer?

If one wants to get a start address of a array or a string or a block of memory via a function, there are at least two methods to achieve it: (1) one is to pass a pointer-to-pointer parameter, like: int my_malloc(int size, char **pmem) { *pmem=(char *)malloc(size); if(*pmem==NULL)... (11 Replies)
Discussion started by: aaronwong
11 Replies

6. Programming

String and pointer problem

i am having a string like " X1 " ---> string lenght is 30 I have stored this to a chararry . ref so here ref = " X1 " now i trim the left space by my function . Si the string now becomes "X1 " ---> string lenght is 15... (3 Replies)
Discussion started by: arunkumar_mca
3 Replies

7. Programming

pointer problem

could any one tell why the following is showing segmentation fault while using **ptr but working fine using **a #include<stdio.h> ... (1 Reply)
Discussion started by: useless79
1 Replies

8. Programming

problem with scanf

hi all! i've written a simple c program: #include<stdio.h> #include<stdlib.h> int main() { int a; char b; char c; ... (4 Replies)
Discussion started by: mridula
4 Replies

9. Programming

Problem with function which reutrns pointer to a value

i have a function: char *pcCityIdToCountryName(ADMIN_DB_DATA *pstHEader, unit uiCityID) this returns a pointer to CountryName if cityId is given. to retrieve countryname i give: char *CountryName; CountryName = pcCityIdToCountryName(..................); but when i compile it is giving :... (5 Replies)
Discussion started by: jazz
5 Replies

10. Programming

Scanf problem under LINUX...

I have a problem reading characters from keyboard with the scanf function. Here there is a little piece of code: #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> /* The last 3 libraries are included because in the real program I use some... (4 Replies)
Discussion started by: robotronic
4 Replies
Login or Register to Ask a Question