struct,typedef,array and pointer [all togther?]
This post is part of http://www.pusheax.com/2013/03/struct-and-typedef-of-c-programming.html . Such as struct, pointer, typedef example. I have did some more advanced things with struct:
Compile and Run:
#include <stdio.h>
#include <string.h>
int main()
{
//Yes We can declar a whole sentence in variable(Remember *):
char *str="We need to know programming for being a security resarcher.";
int *ptr; //We declaring c pointer which start with asteric!
int anotherN; // This int variable
anotherN=1337; //The current value of the declared variable.
int what; //A blank variable has been declared.
ptr=&anotherN; //This is the pointer trick. ptr now pointing to address of anotherN
what=*ptr; /*Now what=address_of_anotherN, and anotherN_address=1337. So what=1337.
Whenever we are going to change the value of a variable using a pointer
remember that we need the asteric. First we need "&" as reference address.
then we need the asteric for getting final declaration and the value. */
*ptr=420; /* Remember that anotherN's value was 1337 ? But now it is 420. So we really
can change the value anything by declaring new value. Remember that it will
only change the value of the reference address. So in our case it "anotherN" */
printf("\n\n\n%s\n",str); //Print the value of "str"
printf("Value of what: %d\n",what);
printf("Value of anotherN: %d\n",anotherN);
//Time to go in advanced!
typedef struct pusheax
{
int push;
char add[20]; //It is not a problem using array.
}pUsheax; //The masked name
pUsheax instanc; //Getting instance name of the struct.
pUsheax *mypusheax; //Declaring "pusheax" type pointer. Yes we can have pointer in struct.
mypusheax=&instanc; //Pointing to instanc
instanc.push=100; //push=100
//Print the value of "push":
printf("The current value of \"push\" is: %d\n",instanc.push);
mypusheax->push=200; /* Here is tricky? Now we are not changing the value using asteric.
here we are using dash and "greater than" operator to redirect to
declard variable. Data actually going mypusheax and mypusheax
transfering the data to "push". So it shopisticately chage the value.*/
printf("Now \"push\"= %d\n\n\n",instanc.push);
strcpy(mypusheax->add,"www.pusheax.com"); /*store the string pusheax.com in "add" array.
strcpy is evil. It causes the buffer overflow
if the "add" array gets fill with more than 20
value then stack will get overwriten. Because
strcpy does not check boundary. More secure function
is strncpy() :)*/
printf("\t\t\t\t\t%s\n",instanc.add); //We print the current value of add[20] declared array.
printf("\t\t\t\t\t---------------\n");
printf("\t\t\t\t\t%s\n\n\n",mypusheax->add); /* We also can get the value of add[] instead calling
calling instanc.add */
}
Compile and Run:
push@pusheax:~/code$ gcc strucptr.c -o strucptr
push@pusheax:~/code$ ./strucptr
We need to know programming for being a security resarcher.
Value of what: 1337
Value of anotherN: 420
The current value of "push" is: 100
Now "push"= 200
www.pusheax.com
---------------
www.pusheax.com
push@pusheax:~/code$