Note that the parameter for scanf doesn't need the address operators & because name is an address. However the variable name has no defined space. This can cause problems within C and we really should define the space .Within C we can allocate space by means of character array or system functions namely malloc, free and calloc.If we declare a character array, it also reserves the space required for that string (After all a string is a collection i.e. array of characters). Therefore the program becomes
#include stdio.h
void main()
{
char prompt;
/*Author : Mr James Mc Carren
Company: Staffordshire University
Date: 26th August 2012
Version 1.0
Function : String storing using static storage
Modifications: none*/
char name[20];
scanf("%s",name);
printf("your name is %s \n\r",name);
printf("Press and key to exit \n\r");
scanf("\n%c",&prompt);
}
This allocates 20 spaces to the string name, however if we wish to input a 50 character string , we would need to re-compile the program , an alternative is to use Malloc/Free .Malloc checks during run time whether there is enough space left and if there is it allocated it while Free releases the space allocated to a variable .The syntax for malloc/Free is
variable = ( char *)malloc(char size);
free(variable);
Therefore the program becomes
#include stdio.h
#include stdlib.h
void main()
{
char prompt;
Date: 26th August 2012
Version 1.0
Function : String storing using dynamic allocation
Modifications: none*/
char *name;
name = (char *)malloc(20);
if (name == NULL)
{
printf("Cannot allocate memory\n\r");
exit(1);
}
scanf("%s",name);
printf("your name is %s \n\r",name);
free(name);
printf("Press and key to exit \n\r");
scanf("\n%c",&prompt);
}
Because Malloc allocates memory dynamically, we must place a trap routine to detect when the microprocessor cannot allocate memory (i.e. memory full), in this case malloc returns a NULL character back as the address of the variable i.e. This routine would detect the NULL character and exit the program .Note that malloced space is similar to a variable in that its life span is automatically terminated when a free command is used or the function where it was allocated ends no matter what you make read - this is not the case in C++
if (name == NULL)
{
printf("Cannot allocate memory\n\r");
exit(1);
}
Therefore we could allocate a scratch pad of memory using malloc and we can poke around in that
area e.g.
#include
#include
void main()
{
char prompt;
Date: 26th August 2012
Version 1.0
Function : Dynamic allocation of windows pointr area i.e segmented memory
Modifications: none*/
char *name;
unsigned long int address;
unsigned char *add;
unsigned char data;
name = (char *)malloc(0x4000);
if (name == NULL)
{
printf("Cannot allocate memory\n\r");
exit(1);
}
printf("Your segment area is %08lx to %08lx\n\r",name,name+(unsigned long int)0x4000);
printf("Please enter in the address you want to read in the segment area\n\r");
scanf("%lx",&address);
add = (unsigned char *)address;
data = *add;
printf("The data at the address %08lx is %02x\n\r",address,data);
printf("Press and key to exit \n\r");
scanf("\n%c",&prompt);
}