As my name says, I am a student, thus my exam's in C comes this Thursday!
So, I took a simulation of the final exams, with the exams of the previous year. I did well, but I missed question k on pointer arithmetic subject. I thought that the behavior was undefined, but A is printed normally. :/ Why?
In my mind, pointer s is at the start of the string literal, we move it one position backwards and then we pass it in strlen! So what we pass in strlen is memory that is not ours!
Code
OutputCode:#include <stdio.h>
#include <string.h>
int main(void)
{
char* s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
printf("*(s+2) = %c\n", *(s+2));
s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
/*ERROR printf("**s = %c\n", **s);
s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";*/
printf("c)UNDEFINED *(s+*s) = %c\n", *(s+*s));
s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
printf("d) s[6] = %c\n", s[6]);
s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
printf("e) (&(s[2]))[-1] = %c\n", (&(s[2]))[-1]);
s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
printf("f) (&(s[-1]))[2] = %c\n", (&(s[-1]))[2]);
s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
printf("g) *(s++) = %c\n", *(s++));
s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
printf("h) *(++s) = %c\n", *(++s));
s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
printf("i) s[strlen(s)-1] = %c\n", s[strlen(s)-1]);
s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
printf("j) s[strlen(s + 1)] = %c\n", s[strlen(s + 1)]);
s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
printf("k)UNDEFINED s[strlen(s - 1)] = %c\n", s[strlen(s - 1)]);
s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
printf("l) s[strlen(s + 1)-1] = %c\n", s[strlen(s + 1)-1]);
s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
printf("m) *(s--) = %c\n", *(s--));
s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
printf("n)UNDEFINED *(--s) = %c\n", *(--s));
s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
printf("o) s[*(s+6)-s[4]] = %c\n", s[*(s+6)-s[4]]);
s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
printf("p)UNDEFINED s[*(s+6)-4] = %c\n", s[*(s+6)-4]);
s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
printf("q) s[*(s+4)-*(s+3)] = %c\n", s[*(s+4)-*(s+3)]);
s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
printf("r)NULL TERMINATOR *(s+strlen(s)) = %c\n", *(s+strlen(s)));
s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
printf("s) s[*(s+strlen(s))] = %c\n", s[*(s+strlen(s))]);
s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
return 0;
}
/* I decided to upload the whole question, because all the students have or are about to have exams, so they can practice a bit. Moreover, for the no-students members, I know that this will make them remember something they probably have forgotten. */Code:*(s+2) = C
c)UNDEFINED *(s+*s) =
d) s[6] = G
e) (&(s[2]))[-1] = B
f) (&(s[-1]))[2] = B
g) *(s++) = A
h) *(++s) = B
i) s[strlen(s)-1] = Z
j) s[strlen(s + 1)] = Z
k)UNDEFINED s[strlen(s - 1)] = A
l) s[strlen(s + 1)-1] = Y
m) *(s--) = A
n)UNDEFINED *(--s) =
o) s[*(s+6)-s[4]] = C
p)UNDEFINED s[*(s+6)-4] = )
q) s[*(s+4)-*(s+3)] = B
r)NULL TERMINATOR *(s+strlen(s)) =
s) s[*(s+strlen(s))] = A
linux05:/home/users/std10093>