"pointer to char" address restoring problem

M

Mahesh

#include <stdio.h>
#include <string.h>
#include <malloc.h>
int main(void)
{
int key = 120;
char *s = "String to Encrypt using XOR";
char *ss = s;
char echar;
char dchar;
size_t sizeofmsg = strlen(s)*sizeof(char*);

char *emsg = (char*)malloc(sizeofmsg);
char *dmsg = (char*)malloc(sizeofmsg);

char *ddmsg = dmsg;
char *eemsg = emsg;
int lenofmsg = strlen(s);
int count=0;
int i=0;

while(count++<strlen(s)){

echar = (char)(*ss^key);
emsg = &echar;
emsg++;
ss++;
}
count=0;
emsg = eemsg; // HERE when i restore the address of emsg via
eemsg, i'm not able to
// decrypt. How to restore the address of
original pointer to char ?.
i=0;
printf("\n");
while(count++<strlen(s)){

echar = *emsg;
dchar = (char)(echar ^ key);
ddmsg = &dchar;
printf(" %c",dchar);
emsg++;
ddmsg++;
}
printf("\n");
getch();
return 0;
}
 
M

Michael Mair

Mahesh said:
#include <stdio.h>
#include <string.h>
#include <malloc.h>

int main(void)
{
int key = 120;
char *s = "String to Encrypt using XOR";
char *ss = s;
char echar;
char dchar;
size_t sizeofmsg = strlen(s)*sizeof(char*);

Wrong calculation.
It should be (number of elements)*(size of the type s points to).
That is,
sizeofmsg = (strlen(s) + 1) * sizeof *s;
as s points to char and sizeof (char) is guaranteed to be 1,
you can write
sizeofmsg = strlen(s) + 1;
The "+1" stems from the string terminator that is not included
in the string length but contributes to the string's size.
char *emsg = (char*)malloc(sizeofmsg);
char *dmsg = (char*)malloc(sizeofmsg);

Note that the cast is unnecessary and can hide an error; around
here,
T *p = malloc(NumberOfElems * sizeof *p);
is recommended.
char *ddmsg = dmsg;
char *eemsg = emsg;
int lenofmsg = strlen(s);
int count=0;
int i=0;

while(count++<strlen(s)){

echar = (char)(*ss^key);

Note that XOR encryption of the value key leads to 0 ('\0'),
which also is the string terminator.
emsg = &echar;

You probably mean
*emsg = echar;

&echar is just that, the address of echar; you do not change
the contents of the storage area you got from malloc().
So, in every iteration, you point emsg at the same object.

Note that for s, you iterate on the copy, and for emsg, you
iterate on the "original". This can lead to problems.
emsg++;
ss++;
}
count=0;
emsg = eemsg; // HERE when i restore the address of emsg via
eemsg, i'm not able to
// decrypt. How to restore the address of
original pointer to char ?.

// style comments break easily on usenet; I recommend that you use
/**/ comments which cannot change semantics or "compilability" due
to line breaks
i=0;
printf("\n");
while(count++<strlen(s)){

echar = *emsg;
dchar = (char)(echar ^ key);
ddmsg = &dchar;
printf(" %c",dchar);
emsg++;
ddmsg++;
}
printf("\n");
getch();
return 0;
}

Cheers
Michael
 
M

Mahesh

Wrong calculation.
It should be (number of elements)*(size of the type s points to).
That is,
  sizeofmsg = (strlen(s) + 1) * sizeof *s;
as s points to char and sizeof (char) is guaranteed to be 1,
you can write
  sizeofmsg = strlen(s) + 1;
The "+1" stems from the string terminator that is not included
in the string length but contributes to the string's size.




Note that the cast is unnecessary and can hide an error; around
here,
  T *p = malloc(NumberOfElems * sizeof *p);
is recommended.




Note that XOR encryption of the value key leads to 0 ('\0'),
which also is the string terminator.


You probably mean
  *emsg = echar;

&echar is just that, the address of echar; you do not change
the contents of the storage area you got from malloc().
So, in every iteration, you point emsg at the same object.

Note that for s, you iterate on the copy, and for emsg, you
iterate on the "original". This can lead to problems.


// style comments break easily on usenet; I recommend that you use
/**/ comments which cannot change semantics or "compilability" due
to line breaks



Cheers
  Michael

Thanks you so much Michael for you invaluable reply.

-
Mahesh
 
P

pete

These two idioms are both worth knowing:

ptr = malloc(NMEMB * sizeof *ptr);

ptr = malloc(STRING_LENGTH + 1);
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,535
Members
45,007
Latest member
obedient dusk

Latest Threads

Top