2013-08-12 3 views
0

надеюсь, что у вас все отлично!Вопросы и функции памяти

В настоящее время я пересматриваю экзамены и придумал пару вопросов на прошлой бумаге, в которой я застрял, и буду благодарен за любую помощь/объяснение, которое вы можете предоставить! :)

Вот вопросы;

1.) Функция power() должна реализовать функцию n* 2^p (Выходной сигнал линии printf() должен быть 5*(2^2) = 20). Завершите тело функции power() с помощью оператора сдвига. Почему разумно использовать оператор сдвига вместо доступной функции питания в math.h?

#include <stdio.h> 

int power(int n, int p) { 
    << YOUR CODE GOES HERE >> 
} 

main() { 
    printf("%d*(2^%d) = %d\n",5,2,power(5,2)); 
} 

2.) Память организована в областях, называемых Text, Data, Stack and Heap. В приведенной ниже программе определяются переменные a, b и c. В какой области памяти хранится содержимое каждой переменной?

#include <stdio.h> 
#include <stdlib.h> 

int a = 5; 

int func1(int x) { 
    int b=5; 
} 

main { 
    char * c; 

    c = (char*) malloc (a+1); 
    func1(a); 
    return 0; 
} 

У меня есть еще несколько вопросов, которые нужно задать, но увидят, как это происходит! Я никогда раньше не использовал stackoverflow, поэтому, пожалуйста, пройдите, если я сделал что-то неправильно!

Большое спасибо,

Dan

+0

Кто-то еще сделал это за вас, но в будущем вы можете отформатировать сегменты кода, выделив их и нажав кнопку '{}'. – Michelle

+0

Спасибо за головы Мишель, и спасибо mbratch за то, что он менял для меня! Я прошу прощения за то, что он был так сильно отформатирован в первом посте, но это был мой первый пост на этом сайте! :) – CBreeze

+0

Нет проблем, если вы можете учиться. Кроме того, если вы ищете код (например, функцию 'power()'), вы должны попробовать сначала, а затем, если это не сработает, укажите свои попытки и результат, чтобы мы могли направлять вас вправо направление. – Michelle

ответ

1

1 -

потому что вопрос хочет, чтобы показать, как работать нашу власть с помощью оператора сдвига; не показывать, что вы знаете, как использовать c библиотеку времени выполнения.

a - data 
b - stack 
c - stack 

он, вероятно, хочет с - куча, но тот не случай. Содержимое с в стеке

+0

И он, вероятно, имел в виду, что содержимое '* c' находится в куче. :) – lurker

+0

Спасибо за такой быстрый ответ! Могу ли я просто спросить об этом также для вопроса 1, вы могли бы предложить решение для части << ВАШЕГО КОДА ИМЕЕТЕ ЗДЕСЬ >>? Также для 2, вы могли бы дать какие-либо дополнительные объяснения относительно того, почему каждый а/б/с является таким? Большое спасибо! – CBreeze

+0

@ DanDoughty просто взять бумагу и ручку. Что такое 2⁰, 2¹, 2² и т. Д. В двоичном формате? Вы находите шаблон? –

0

1>

#include <stdio.h> 


int power(int n, int p) 

{ 

return n<<p; // p is the number of bits left-shifted 
} 

main() 

{ 
printf("%d*(2^%d) = %d\n",5,2,power(5,2)); 
} 

2>

а: данные б: стек с: стек

+0

Я думаю, что power() неверно, это должно быть: n * (1 << p); –

+0

Могу ли я попросить объяснение для вопроса 2? – CBreeze

+0

Извините, Saikat Я имею в виду вопрос о данных/стек/кучу – CBreeze

1

Во-первых, я дам вам написать свой собственный код, который является лучшим способом обучения. Но я отвечу на теорию, стоящую за этими вопросами ...

1) при поднятии числа 2 на n-ю степень, то же самое, что умножение 2 на себя n раз. Но умножение на 2 аналогично удвоению числа, а компьютеры хранят свои номера в базе 2. Например, двоичное значение для 6 == 0b00110, но когда все биты сдвинуты влево на 1, тогда 12 == 0b01100 , что совпадает с 6 * 2. Так, например, 16 == 4^2 = 4 * 4 = 4 * (2 * 2) или в двоичном формате 16 == 0b010000 == 0b001000 * 2 = (0b00100) * 2 * 2.

2) когда переменная объявлена ​​вне всех подпрограмм, она находится в «глобальном» хранилище, также, вероятно, называется «данные». Когда переменная объявляется в рамках процедуры, она является «автоматической» переменной (что означает, что она автоматически) и выделяется в стеке. Когда переменная явно выделена, в качестве примера используется malloc, то она выделяется в куче.

В C указатели имеют два компонента данных или элементы хранения. Во-первых, это сам указатель, который обычно использует только 4 байта. Затем данные, которые являются любой длиной, были выделены для данных. Чтобы сказать что-нибудь еще, повторите информацию, предоставленную другими ответами!

Это хорошая практика программирования для free все хранилище, выделенное на кучу. Несмотря на то, что система должна освободить это хранилище, когда выйдет main, это НЕ всегда гарантируется, особенно на небольших или встроенных системах. Таким образом, пример кода должен заканчиваться как:

free(c); 
    return 0; 
Смежные вопросы