Mark Asnee
Mark Asnee

Reputation: 17

Pointer to structure in C

How can I display the stored values via pointer, my code outputs to NULL. I've already tried assigning the struct emp to ptr before the 2nd loop but it won't run.

struct rec {
    char *Name;
}emp[100];

int main() {

int x;
int i;

struct rec *ptr = NULL;
ptr = emp;

printf("Enter Number of Clients: ");
scanf("%d", &x);
getchar();

for(i=0; i!=x; i++){
    printf("Enter Name: ");
    scanf("%[^\n]", &ptr->Name);
    getchar();

    ptr++;
    printf("\n");
}
i = 0;
while(i!=x){
        printf("Name is: %s\n", *ptr->Name);
        i++;
        ptr++;
}

If the code iterates twice it prints Name: (NULL) Name: (NULL)

Upvotes: 2

Views: 105

Answers (3)

abhiarora
abhiarora

Reputation: 10430

How can I display the stored values via pointer, my code outputs to NULL. I've already tried assigning the struct emp to ptr before the 2nd loop but it won't run.

There are several issues in your code which are listed below:

  1. You need to re-initialize your ptr pointer to the beginning of the array emp after the first loop.

    ptr = emp;

  2. Second one being data member name of your struct emp. It is just a pointer and it doesn't point towards a valid memory address where you can save user input cstring. Either you need to allocate the memory dynamically using malloc or use statically allocated memory just like shown below. However, you can have buffer overflow if you input characters more than DEFAULT_NAME_SIZE (including /0 character).

  3. %[^\n] matches a char *, not a char **. You need to use scanf("%[^\n]", ptr->Name); not scanf("%[^\n]", &ptr->Name);.

  4. "%s" format specifier of printf requires an arugment of type char * but you have been passing char type to it. The correct statement is printf("Name is: %s\n", ptr->Name);.

-

#include <stdio.h>

#define DEFAULT_NAME_SIZE       200

struct rec {
     char Name[DEFAULT_NAME_SIZE];
} emp[100];

int main() 
{
    int x;
    int i;

    struct rec *ptr = NULL;
    ptr = emp;

    printf("Enter Number of Clients: ");
    scanf("%d", &x);
    getchar();

    for (i=0; i< x; i++){
        printf("Enter Name: ");
        scanf("%[^\n]", ptr->Name);
        getchar();

        ptr++;
        printf("\n");
    }

    ptr = emp;
    for (i = 0; i < x; i++){
        printf("Name is: %s\n", ptr->Name);
        ptr++;
    }


    return 0;

}

You can try to enable all warning while you compile your code. Most of the bugs can be pointed by the compiler's warning message.

Upvotes: 2

Rafael S. T. Vieira
Rafael S. T. Vieira

Reputation: 67

When scanning or printing strings, we don't use & and * for referencing and dereferencing pointers, but we must also alloc and free space for them. Fixed your code:

#include <stdio.h>
#include <stdlib.h>
struct rec {
    char *Name;
}emp[100];

int main() {

int x;
int i;

struct rec *ptr = NULL;
ptr = emp;

printf("Enter Number of Clients: ");
scanf("%d", &x);
getchar();

for(i=0; i!=x; i++)
{
    printf("Enter Name: ");
    /* alloc space for string pointer */
    ptr->Name = (char*) malloc(sizeof(char)*10);
    scanf("%s[^\n]",ptr->Name);
    getchar();

    ptr++;
    printf("\n");
}
i = 0;
/* reset array pointer position */
ptr=emp;
while(i!=x)
{
        printf("Name is: %s\n", (ptr->Name));
        /* free space for string pointer */
        free(ptr->Name);
        i++;
        ptr++;
}
}

PS: Remember resetting a pointer to the initial position whenever using pointers to arrays.

Upvotes: 0

Joshua
Joshua

Reputation: 43278

char *Name;

You never allocated space for the name. Did you mean

char Name[100]

?

This should work, until somebody enters too long of a name. You will get to buffer overflow later and learn about dynamic memory allocation.

Upvotes: 1

Related Questions