The Gateway to Computer Science Excellence
+22 votes
2.2k views

Consider the following two C code segments. $Y$ and $X$ are one and two dimensional arrays of size $n$ and $ n \times n$ respectively, where $2 \leq n \leq 10$. Assume that in both code segments, elements of $Y$ are initialized to 0 and each element $X[i][j]$ of array $X$ is initialized to $i+j$. Further assume that when stored in main memory all elements of $X$ are in same main memory page frame.

Code segment 1:

// initialize elements of Y to 0
// initialize elements of X[i][j] of X to i+j
for (i=0; i<n; i++)
    Y[i] += X[0][i];

Code segment 2:

// initialize elements of Y to 0
// initialize elements of X[i][j] of X to i+j
for (i=0; i<n; i++)
    Y[i] += X[i][0];

Which of the following statements is/are correct?

S1: Final contents of array $Y$ will be same in both code segments

S2: Elements of array $X$ accessed inside the for loop shown in code segment 1 are contiguous in main memory

S3: Elements of array $X$ accessed inside the for loop shown in code segment 2 are contiguous in main memory

  1. Only S2 is correct
  2. Only S3 is correct
  3. Only S1 and S2 are correct
  4. Only S1 and S3 are correct
in Programming by Veteran (105k points)
recategorized by | 2.2k views
+4
As it's not specified ,can we consider the 2-D array is stored as column major order ?
+6
No. In C, default storage mechanism is row major order.

4 Answers

+31 votes
Best answer

Option is C. Only $S1$ and $S2$ are correct because $Y$ have same element in both code and in code 1.

 Y[i] += X[0][i];

This row major order (In C, arrays are stored in row-major order)  which gives address of each element in sequential order$(1,2,3,....,n)$ means we cross single element each time to move next shows   contiguous in main memory but in code2 for:

$Y[i] += X[i][0];$

We are crossing n element (row crossing with n element )to move next.
by Active (5k points)
edited by
+2
I agree that only S1 and S2 are correct.
Hence Option C
+2
why should we assume that elements are stored in ROW MAJOR ORDER ... why not COLUMN MAJOR ORDER,,, as it is not specified in the question ?
+6

storage of arrays in C is always row major. I found the following reference for this. 

http://ee.hawaii.edu/~tep/EE160/Book/chap9/section2.1.2.html

+4
Can anyone explain this statement : "Assume that when stored in main memory, all elements of X are in same main memory page frame"
+5

@Shweta Nair

it fits a page so that when we fetch it , we just have to do one page fetch. contents of single page are stored contiguously in memory. since question is asking about contiguous nature of elements, we need this statement to tell that , by paging , elements are not physically seperated in memory when stored.

+1
Got it. Thanks.
+5 votes
answer will be c

as s1 is right(final contents are same ) and s2 as we are getting

consider size of 4

y[0]=0(same as x[0][0])

y[1]=2(as x[0][1]=0+1=1 and y[1]=0+1)

y[2]=1(x[0][2]=0+2=2 and y[2]=0+2)

thus following row major order as in c
by Boss (16.1k points)
+2 votes

Actually Answer depends upon storage scheme of array(Row major or Column major). However if it is not mentioned in the Question that which Scheme is used then assume it is stored in Row major because by default it is stored in Row major so here answer restrict to option C only.

by Active (3.5k points)
0
In s3 Elements of array X accessed inside the for loop shown in code segment 2 are not contiguous in main memory  because they stored in column major order 
0 votes
Option :C
by Active (2.7k points)

Related questions

Quick search syntax
tags tag:apple
author user:martin
title title:apple
content content:apple
exclude -tag:apple
force match +apple
views views:100
score score:10
answers answers:2
is accepted isaccepted:true
is closed isclosed:true
50,647 questions
56,496 answers
195,488 comments
100,791 users