({{Template:Author|Arjun Suresh|{{arjunweb}} }})
 
(5 intermediate revisions by the same user not shown)
Line 25: Line 25:
 
(D) Garbage value
 
(D) Garbage value
  
===Solution===
+
==={{Template:Author|Arjun Suresh|{{arjunweb}} }}===
Assume start location of arr s 1000.
+
Assume start location of arr is 1000.
 
So, the first two elements of the array will be stored in memory as follows:
 
So, the first two elements of the array will be stored in memory as follows:
  
  1000: 0 0 0 0 0 0 0 2 (hexa decimal representation and assuming int takes 4 bytes)
+
  1000: 0 2 0 0 0 0 0 0 (hexa decimal representation and assuming int takes 4 bytes and assuming least significant byte is stored at lowest address(little-endian))
  1004: 0 0 0 0 0 0 0 3
+
  1004: 0 3 0 0 0 0 0 0
  
Now, %d, *p will print the first 4 bytes starting at 1000, that is 2. When p is incremented, it will go to 1001, as p is a char pointer.
+
Now, %d, *p.
 +
Here, *p is a character which is just a byte. So, *p value here is the byte at address 1000 which is 02 (in hex) and this is passed to printf. In C language, when a char is passed to a function actually it's int value as given by the char code (usually ASCII) is passed. So, here 02 is sign-extended to 0002 and passed to printf. Now, in printf we used %d, and hence the output will be 2.  
 +
 
 +
When p is incremented, it will become to 1001, as p is a char pointer (for pointer addition, sizeof datatype pointed to is added and sizeof char is 1). So, now the value of *p is 00 and as explained above printf will print 0 for this.  
 
  1001: 0 0 0 0 0 0 0 0
 
  1001: 0 0 0 0 0 0 0 0
  
 
So, output will be 0.  
 
So, output will be 0.  
  
 
+
On a big-endian machine output will be 0 0. So, correct answer should be architecture dependent.
  
 
{{Template:FBD}}
 
{{Template:FBD}}

Latest revision as of 13:22, 18 March 2015

What's the output?

<syntaxhighlight lang="c" name="pointer_1"> int main() {

       int arr[3] = {2, 3, 4};
       char *p;
       p = (char*)arr;
       printf("%d ", *p);
       p = p+1;
       printf("%d\n", *p);
       
       return 0;

}


</syntaxhighlight>


(A) 2 3

(B) 2 0

(C) 1 0

(D) Garbage value

Solution by Arjun Suresh

Assume start location of arr is 1000. So, the first two elements of the array will be stored in memory as follows:

1000: 0 2 0 0 0 0 0 0 (hexa decimal representation and assuming int takes 4 bytes and assuming least significant byte is stored at lowest address(little-endian))
1004: 0 3 0 0 0 0 0 0

Now, %d, *p. Here, *p is a character which is just a byte. So, *p value here is the byte at address 1000 which is 02 (in hex) and this is passed to printf. In C language, when a char is passed to a function actually it's int value as given by the char code (usually ASCII) is passed. So, here 02 is sign-extended to 0002 and passed to printf. Now, in printf we used %d, and hence the output will be 2.

When p is incremented, it will become to 1001, as p is a char pointer (for pointer addition, sizeof datatype pointed to is added and sizeof char is 1). So, now the value of *p is 00 and as explained above printf will print 0 for this. 
1001: 0 0 0 0 0 0 0 0

So, output will be 0.

On a big-endian machine output will be 0 0. So, correct answer should be architecture dependent.




blog comments powered by Disqus

What's the output?[edit]

<syntaxhighlight lang="c" name="pointer_1"> int main() {

       int arr[3] = {2, 3, 4};
       char *p;
       p = (char*)arr;
       printf("%d ", *p);
       p = p+1;
       printf("%d\n", *p);
       
       return 0;

}


</syntaxhighlight>


(A) 2 3

(B) 2 0

(C) 1 0

(D) Garbage value

Solution[edit]

Assume start location of arr s 1000. So, the first two elements of the array will be stored in memory as follows:

1000: 0 0 0 0 0 0 0 2 (hexa decimal representation and assuming int takes 4 bytes)
1004: 0 0 0 0 0 0 0 3

Now, %d, *p will print the first 4 bytes starting at 1000, that is 2. When p is incremented, it will go to 1001, as p is a char pointer.

1001: 0 0 0 0 0 0 0 0

So, output will be 0.





blog comments powered by Disqus