{ "q1": { "type": "blank", "question": "\n

Given allocations.c, fill in the table below to identify how\nmuch memory (in bytes) is allocated in each memory segment (ie.\nstack, heap, data) for the corresponding variable\ndeclaration:

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n\n \n \n \n \n \n \n\n \n \n \n \n \n \n\n \n \n \n \n \n \n\n \n \n \n \n \n \n\n \n \n \n \n \n \n\n \n \n \n \n \n \n\n \n \n \n \n \n \n\n \n
CodeDataHeapStack
double GD = 3.14;____ ( 1)____ ( 2)____ ( 3)
int a[] = {5, 7, 4};____ ( 4)____ ( 5)____ ( 6)
char *sp = \"Video Games\";____ ( 7)____ ( 8)____ ( 9)
char sa[] = \"Runescape\";____ (10)____ (11)____ (12)
Block b = {0};____ (13)____ (14)____ (15)
Point p0 = {0, 0};____ (16)____ (17)____ (18)
Point *p1 = NULL;____ (19)____ (20)____ (21)
Point *p2 = malloc(sizeof(Point));____ (22)____ (23)____ (24)
Point *p3 = malloc(5*sizeof(Point));____ (25)____ (26)____ (27)
Point **p4 = malloc(5*sizeof(Point *));____ (28)____ (29)____ (30)
\n\n

Assume this program is compiled on a 64-bit Linux machine (ie. the\nstudent machines).

\n" }, "q2": { "type": "multiple", "question": "\n

Build str_rev.c with the appropriate compiler flags and then\nrun it using gdb:

\n\n
\n$ gcc -Wall -g -std=gnu99 -o str_rev str_rev.c\n\n$ gdb ./str_rev\n...\n(gdb) run old school\n...\nProgram received signal SIGSEGV, Segmentation fault.\n(gdb) bt\n...\n
\n\n

Which of the following statements are true (select all that apply)?

\n", "responses": { "puts": "The program segfaults on the line puts(t).", "copy": "The program segfaults on the line *w++ = *r--.", "strcpy": "The program segfaults on the line strncpy(t, s, strlen(s)).", "strlen": "The program segfaults on the line char *t = malloc(strlen(s)).", "nulls": "The program segfaults because s is NULL.", "nullt": "The program segfaults because t is NULL.", "longs": "The program segfaults because s is too long.", "longt": "The program segfaults because t is too long.", "frees": "To fix the segfault, we must call free(s).", "freet": "To fix the segfault, we must call free(t).", "inti": "To fix the segfault, we must set int i = 0 in the for loop.", "argc": "To fix the segfault, we must check i < argc in the for loop." } }, "q3": { "type": "multiple", "question": "\n

Fix the segmentation fault in Q2, rebuild the program, and then\nuse valgrind to run the program:

\n\n
\n$ valgrind --leak-check=full ./str_rev old school\n
\n\n

Which of the following statements are true (select all that apply)?

\n", "responses": { "nouninits": "There are no uninitialized memory accesses.", "uninits": "There are uninitialized memory accesses.", "noleaks": "There are no memory leaks.", "leaks": "There is a memory leak.", "noinvalids": "There are no invalid memory accesses.", "invalids": "There are invalid memory accesses." } } }