...
  View open merge request
Commits (2)
......@@ -43,9 +43,7 @@ em que o programa ficou em execução. Como o tamanho dos segmentos é fixo (da
estática), esses 2 Mb de memória alocados estaticamente estariam reservados para o programa, mas não
seriam utilizados (um exemplo de programa mal-comportado).
Ou seja, o programa estaria retendo 2 Mb de memória que poderiam ser usados por outros programas
e essa memória alocada, mas não utilizada, pode trazer problemas, como impedir que se possa executar
outros programas por falta de memória.
Ou seja, o programa estaria retendo 2 Mb de memória que poderiam ser usados por outros programas, podendo impedir a execução dos mesmos por falta de memória.
Poderia ser argumentado que pelo menos o programa funciona. Agora suponha que aquele arquivo
tivesse seu tamanho aumentado para 2.5 Mb. Seria necessáro alterar no código o tamanho da matriz e
......@@ -57,7 +55,7 @@ liberados para outros programas quando deixassem de ser úteis.
É aí que entra a alocação dinâmica: a alocação dinâmica permite que o programa reserve uma área
de memória de qualquer tamanho (dentro dos limites do tamanho da memória, é claro) em tempo de
execução. Isso quer dizer que o programa/programador/compilador não precisa saber antecipadamente
o tamanho do bloco de memória de que o nosso programa precisa.
o tamanho do bloco de memória de que o programa precisa.
Durante a execução, o programa descobre qual é o tamanho da área de memória que necessita e pede
ao sistema operacional para reservar uma área de memória daquele tamanho. O sistema operacional
......@@ -70,7 +68,7 @@ de memória alocada. No programa, esse endereço pode ser armazenado em um ponte
Antes de apresentar as funções de manipulação de memória dinâmica, é importante descrever o operador
sizeof.
O operador sizeof é usado para obter o tamanho, em bytes, de um determinado tipo de dado.
O operador sizeof(sim, é um operador) é retorna o tamanho, em bytes, de um determinado tipo de dado ou variável.
A sintaxe geral é:
\begin{lstlisting}
......@@ -78,20 +76,19 @@ sizeof(tipo) // ou ainda
sizeof(variavel)
\end{lstlisting}
O sizeof retorna o tamanho do tipo passado como parâmetro ou do tipo da variável passada como
parâmetro.
Exemplos:
Veja os Exemplos:
\begin{lstlisting}
struct coord {
int x, y, z;
int x; //4 bytes
char y; // 1 bytes
char z[3]; //3 bytes
};
struct coord coordenada1;
struct coord coord_var;
sizeof(struct coord); // obtêm o valor 12 (4 bytes por int )
sizeof(coordenada1); // obtêm o valor 12 (4 bytes por int )
sizeof(struct coord); // obtêm o valor 8 (4 bytes por int + 1 por char + 3 pelo array de chars)
sizeof(coord_var); // obtêm o valor 8 (4 bytes por int + 1 por char + 3 pelo array de chars)
sizeof(int); // obtêm o valor 4
\end{lstlisting}
......@@ -103,7 +100,7 @@ tipo de dado.
A função malloc requisita ao sistema operacional para alocar uma área de memória do tamanho especificado.
Essa função é extremamente útil para gerar matrizes cujo tamanho não é possível ser definido antes
de executar o programa. Além disso, existem estruturas de dados (listas, filas, pilhas, entre outras) que
de executar o programa. Além disso, existem diversas estruturas de dados (listas, filas, pilhas, entre outras) que
tem tamanho variável e precisam dessa função para serem implementadas.
O protótipo da função malloc é:
......@@ -142,8 +139,8 @@ int main(){
\end{lstlisting}
Observe que para alocar o tamanho correto para um vetor de int, é necessário multiplicar o número
de células que se deseja pelo tamanho do tipo de dado int porque cada célula individual é do tamanho
int.
de células que se deseja pelo tamanho do tipo de dado int, pois cada célula é do tamanho de um
inteiro.
\section{Função free()}
......@@ -158,6 +155,19 @@ void free (void *memblock);
A função recebe um único argumento, o qual é um ponteiro para uma área de memória previamente
alocada com malloc.
\section{Função realloc()}
A função realloc serve para realocar um espaço de memória previamente alocado, podendo aumentar ou dimuir este espaço.
O protótipo da função realloc é:
\begin{lstlisting}
void *realloc(void *ptr, size_t size)
\end{lstlisting}
A função recebe dois parâmetros. O primeiro é um apontador para o endereço da memória que será realocado e o segundo é o tamanho do espaço desejado.
\vspace*{\fill}
\textit{Este espaço foi propositalmente deixado em branco. Veja o código completo na próxima página.}
......@@ -168,12 +178,12 @@ alocada com malloc.
\section{Exercícios}
1) Faça uma função gera matriz com os seguintes parâmetros:
1) Faça uma função gera uma matriz com os seguintes parâmetros:
\begin{lstlisting}
int*** geramatriz(int x, int y, int z, int tam);
\end{lstlisting}
A função deverá alocar uma matriz de dimensão 3, cada dimensão deverá ter tamanho tam e, ao final,
A função deverá alocar uma matriz de dimensão 3, cada dimensão deverá ter tamanho "tam" e, ao final,
a função retorna a matriz.
2) Crie uma função que seja capaz de redimensionar um vetor previamente alocado (vetor de dimensão
......@@ -182,13 +192,13 @@ a função retorna a matriz.
A função será chamada realoca e receberá os seguintes parâmetros:
\begin{lstlisting}
int* realoca(int *vetor, int tam, int novo tam);
int* realoca(int *vetor, int tam, int novo_tam);
\end{lstlisting}
Onde vetor é o vetor que deve ser realocado, tam é o tamanho velho do vetor e novo tam é o novo
Onde "vetor" é o vetor que deve ser realocado, "tam" é o tamanho velho do vetor e "novo_tam" é o novo
tamanho.
A função deverá ser capaz de preservar o conteúdo de vetor. Se o novo tam for menor que tam, a
A função deverá ser capaz de preservar o conteúdo de vetor. Se o novo tamanho for menor que o antigo, a
informação das células excedentes deve ser descartada.
\end{document}
......@@ -7,8 +7,7 @@
\chapter{Operadores}
Um operador é um símbolo que faz com que uma determinada operação,
ou ação, seja executada com um
ou mais operandos. Um operando é aquilo sobre o qual o operador atua.
ou ação, seja executada, podendo esta ação ser composta por um ou mais operadores. Um operando é aquilo sobre o qual o operador atua.
Os operadores da linguagem C
enquadram-se em diversas categorias.
......@@ -135,7 +134,7 @@ na tabela \ref{tab:binop}.
\hline Multiplicação & * & Multiplica seus dois operandos & x * y \\
\hline Divisão & / & Divide o primeiro operando pelo segundo & x / y \\
\hline Módulo & $\%$ &
Fornece o resto da divisão do primeiro operando pelo segundo &
Fornece o resto da divisão inteira do primeiro operando pelo segundo &
x $\%$ y \\
\hline
\end{tabular}
......@@ -145,9 +144,7 @@ x $\%$ y \\
Os primeiros quatro operadores já são familiares e não apresentarão qualquer problema.
O operador módulo talvez seja novo.
O módulo retorna o resto de uma divisão do primeiro operando pelo segundo.
Os primeiros quatro operadores já são familiares, mas o operador módulo talvez seja novo, então veja o exemplo abaixo.
Exemplo:
......@@ -184,8 +181,6 @@ exp1 = exp1 op exp2;
Os operadores compostos existem para os cinco operadores matemáticos binários descritos anteriormente, conforme ilustra a tabela \ref{tab:compop}.
Se você escrever será equivalente a
\begin{table}[h!]\label{tab:compop}
\centering
\begin{tabular}{|rl|rl|}
......@@ -211,12 +206,12 @@ tabela \ref{tab:op-rel}.
\centering
\begin{tabular}{|l|l|l|l|}
\hline Operador & Símbolo & Pergunta Respondida & Exemplo \\
\hline Igual & == & Operando 1 é igual ao operando 2? & x == y \\
\hline Maior que & > & Operando 1 é maior que o operando 2? & x > y \\
\hline Menor que & < & Operando 1 é menor que o operando 2? & x < y \\
\hline Maior ou igual a & >= & Operando 1 é maior ou igual ao operando 2? & x >= y \\
\hline Menor ou igual a & <= & Operando 1 é menor ou igual ao operando 2? & x <= y \\
\hline Diferente & != & Operando 1 é diferente do operando 2? & x != y \\
\hline Igual & == & O primeiro operando é igual ao segundo? & x == y \\
\hline Maior que & > & O primeiro operando é maior que o segundo? & x > y \\
\hline Menor que & < & O primeiro operando é menor que o segundo? & x < y \\
\hline Maior ou igual a & >= & O primeiro operando é maior ou igual ao segundo? & x >= y \\
\hline Menor ou igual a & <= & O primeiro operando é menor ou igual ao segundo? & x <= y \\
\hline Diferente & != & O primeiro operando é diferente do segundo? & x != y \\
\hline
\end{tabular}
\label{tab:op-rel}
......@@ -238,8 +233,8 @@ Os três operadores lógicos da linguagem C são listados na tabela
\centering
\begin{tabular}{|l|l|l|l|}
\hline Operador & Símbolo & Verdadeiro Quando & Exemplo \\
\hline And & \&\& & Expressão 1 E expressão 2 são verdadeiras & exp1 \&\& exp2 \\
\hline Or & || & Expressão 1 OU expressão 2 são verdadeiras & exp1 || exp2 \\
\hline And & \&\& & A primeira E a segunda expressão são verdadeiras & exp1 \&\& exp2 \\
\hline Or & || & A primeira OU a segunda expressão são verdadeiras & exp1 || exp2 \\
\hline Not & ! & A expressão é falsa & !exp1 \\
\hline
\end{tabular}
......