Estrutura de Dados em C Flashcards

1
Q

Qual o impacto da escolha de uma estrutura de dados?

A

A escolha da estrutura de dados tem um impacto direto no desempenho do algoritmo. Se você escolher uma estrutura inadequada para um certo problema, o desempenho será insatisfatório, acarretando uma má experiência.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Como podemos definir o ponteiro superficialmente?
E de maneira mais profunda?

A

Podemos definir o ponteiro como um tipo especial de variável, na qual o valor atribuído é um endereço de memória.
De maneira mais profunda, podemos defini-lo como uma variável que guarda o endereço de memória de outra variável associada, ou seja, uma variável que guarda a localização do dado de outra variável, isto é, uma variável que aponta para outra.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Como é composta a memória do computador?

A

É composta por palavras que são identificadas unicamente por endereços de memória. Esses endereços de memória são dispostos sequencialmente e possuem tamanho pré-definido de bytes que representam as palavras.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

É sabido que o endereço de memória de um processo em execução é divido em segmentos lógicos, os mais importantes são quais e o que estes armazenam?

A

O segmento Text armazena os códigos do programa e suas constantes.
O segmento Data armazena as variáveis globais e as variáveis estáticas do processo, é a memória de trabalho do processo.
O segmento Heap armazena blocos de memória alocados dinamicamente durante a execução do programa.
O segmento Stack armazena a pilha de execução que guarda os parâmetros, endereços de retorno e variáveis locais de funções.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Como se comportam os segmentos lógicos, os tamanhos variam ou permanecem fixos?

A

No segmento Text, os dados são alocados nele durante a criação do processo “exec” e a partir disso, há tamanho fixo durante toda a execução do programa.
No segmento Data há tamanho fixo durante toda a execução do programa.
No segmento Heap há variação de tamanho durante a execução do programa.
No segmento Stack pode haver variação de tamanho durante a execução do programa.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Como funciona o modificador static da variável?

A

Usando o modificador static na variável mesmo quando o modificador static sair do escopo, ele continua funcionando como se não tivesse saído, seu valor se preserva.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Como se chama o tipo de alocação que geralmente aloca em HEAP e como ela funciona?

A

A alocação que geralmente aloca em HEAP é chamada de alocação dinâmica. Nesse tipo de alocação é requisitada explicitamente pelo programa uma área de memória para armazenamento de dados. O controle dessas áreas pode ser manual ou semiautomático. Desta forma, o programa utiliza as áreas e depois as libera quando não mais forem necessárias ou quando o programa encerrar. A liberação e a alocação dessas áreas alocadas dinamicamente devem ser realizadas pelo programador.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Como se chama o tipo de alocação que geralmente aloca em STACK e como ela funciona?

A

A alocação que geralmente aloca em STACK é chamada de alocação automática. Ela se diferencia pelo fato de ser alocada automaticamente pelo programa, a alocação dessas variáveis é realizada quando a função é invocada e liberada quando a função termina.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Como pode ser feita a alocação dinâmica manual?

A

Em ambas utilizamos a biblioteca stdlib.h.
Na forma simples, usando malloc, free e realloc.
Por vetor, usamos calloc e free.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Para que serve a função malloc?
Ela é útil para ser usada em qual circunstância?
Após o uso de malloc, calloc e realloc é recomendado fortemente fazer o uso de que?

A

Para alocar dinamicamente um bloco de memória durante a execução do programa.
Ela é útil quando você não sabe previamente o tamanho exato de memória necessária ou deseja alocar memória em tempo real com base em condições dinâmicas.
É recomendado fortemente após o uso dessas funções fazer a verificação de retorno delas, para se elas forem igual a NULL, haver o retorno de uma mensagem de erro.
Em realloc, caso realloc seja igual a NULL, devemos liberar e memória alocada anteriormente assim como retornar mensagem de erro.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

O que faz a função realloc?

A

Redimensiona um bloco de memória já previamente alocado, sem perder os dados armazenados anteriormente nele.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Para que serve a função calloc?

A

Serve para alocar dinamicamente memória para um determinado número de elementos e, além disso, inicializa todos os bits da memória alocada com valor 0, diferente de malloc. Mais utilizada quando já se sabe a quantidade exata a ser alocada.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Depois do uso total de calloc, malloc e realloc, devemos usar qual função?

A

Devemos usar free para liberar a memória alocada.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Qual é considerada uma das características mais importantes de um ponteiro?

A

Uma das características mais importantes de um ponteiro, é que utilizando-o podemos acessar indiretamente outras variáveis associadas a ele, tanto conseguindo fazer a leitura dessas variáveis, quanto alterá-las.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Como se declara um ponteiro? Como é a forma geral?

A

Utilizando um asterisco(*) entre o tipo da variável e o nome dela.
A forma geral: tipo *nome;

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Quais são os operadores que permitem o uso dos ponteiros?

A
  • & (operador unário “&” ou ponteiro constante): possui a função de obter o endereço de memória de uma outra variável.
    • (operador unário “*” ou indireção): é usado para interagir com a variável que o ponteiro está interagindo, ou seja, apontando.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Em C, como acessar o conteúdo armazenado no ponteiro?

A

*ptr_x;

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

Em C, como modificar o conteúdo armazenado no ponteiro?

A

*ptr_x=50;

19
Q

Em C, como acessar o endereço de memória da varável armazenado no ponteiro?

A

ptr_x;

20
Q

Quando uma indireção múltipla é ocasionada?

A

Quando um ponteiro armazena o endereço de memória de outro ponteiro.

21
Q

Como fazer uma declaração de ponteiro de indireção múltipla?

A

Utilizando n vezes o operador *, sendo n o nivel de indireção.

22
Q

Segue um exemplo de declaração de ponteiro de indireção múltipla, complete as linhas vazias com o correto.
(a) int __ pt2;
(b) int __ pt1;
(c) int ____10;
(d) pt__ = __pt__;
(e) pt__ = ___;
(d) ____=30; (modificação indireta com pt1 de 10 para 30)

A

(a) **
(b) *
(c) x =
(d) 2 = & 1;
(e) 1= &x;
(d) *pt1

23
Q

Ponteiros são muito úteis para quê? em quais situações?

A

Ponteiros são muito úteis para acessar uma determinada variável em diferentes partes de um programa. São muito úteis em várias situações, como em: alocação dinâmica de memória, manipulação de arrays, para retornar mais de um valor em uma função, referência para listas, pilhas, árvores e grafos e também é usado como passagem de parâmetros como referência para funções

24
Q

O que definem as estruturas de dados?

A

Elas definem a organização, métodos de acesso e opções de processamento para coleções de itens de informação manipulados pelo programa. As estruturas são formas de distribuir e relacionar os dados disponíveis, tornando os algoritmos que manipulam esses dados mais eficientes.

25
Q

As estruturas de dados são responsáveis pelo que?

A

São responsáveis por carregar as informações dentro de um software.

26
Q

No seguinte trecho, qual é o tipo das variáveis x, y e z?
int* x, y, z.

A

x é um ponteiro para inteiro. y e z são variáveis inteiras (nãosãoponteiros).

27
Q

O que acontece quando você tenta executar o seguinte código? Por que isso acontece?

int *array = malloc (10 * sizeof(int));
printf(“%d”, array[20]);

A

O comportamento é indefinido (ou seja, pode aparecer qualquer coisa, desde o programa travar até um valor aleatório ser impresso). Isso acontece porque o código está tentando acessar uma posição de memória que ele não alocou, porém a linguagem C não impede esse tipodeprática.

28
Q

Os seguintes trechos de código são alocados no stack ou no heap?
1 - int array[10];
2 - int *array = malloc(10 * sizeof(int));

A

1 - Stack (alocação automática)
2 - Heap (alocaçãodinâmica)

29
Q

O que são “vetores unidimensionais”?

A

Também conhecidos por “arrays”, é uma estrutura de dados homogênea, ou seja, seus elementos podem ter um único tipo, possuem uma única linha; em C são conhecidos como vetores e são acessados por índices.

30
Q

O que são “vetores bidimensionais”?

A

Também conhecidos por “arrays de arrays”, é uma estrutura de dados também homogênea, pode possuir linhas e colunas; em C são conhecidos como matrizes e também são acessados por índices.

31
Q

Como funciona uma “fila”? Qual a expressão que define essa estrutura de dados?

A

É uma lista que só vai para um lado, ou seja, os novos elementos são inseridos ao final da fila e os elementos a serem removidos estão no início da fila.
A expressão que define essa estrutura é FIFO (First-In-First-Out) que significa “o primeiro a entrar será o primeiro a sair”.

32
Q

Como funciona uma “árvore”? Me dê um exemplo de um caso que seria útil utilizar uma árvore como estrutura de dados.

A

Essa estrutura caracteriza uma relação de hierarquia entre os elementos.
Um caso que requisitaria o uso de uma árvore seria o organograma de uma empresa

33
Q

Como funciona uma “lista encadeada”?

A

Essa estrutura implementa um conjunto de dados ordenados homogêneos assim como os vetores, sua diferença é que os elementos não precisam estar fisicamente em sequência, ou seja, eles podem ocupar posições de memória não sequenciais.

34
Q

Como funciona uma “pilha”? Qual a expressão que define essa estrutura de dados?

A

Nessa estrutura, o último elemento a chegar é o primeiro a sair da estrutura, a expressão dessa estrutura é LIFO (Last-In-First-Out), para que o acesso a um elemento da pilha ocorra, os demais acima precisam ser removidos.

35
Q

Como funciona um “grafo”? Me dê um exemplo de um caso em que seria útil usar grafos como estrutura de dados.

A

Essa estrutura organiza vários elementos, estabelecendo relações entre eles, dois a dois.
Exemplo: Ao se estabelecer um trajeto para percorrer todas as capitais do NE do Brasil, devemos utilizar um mapa que indique as rodovias existentes e estabeleça uma ordem para percorrer as cidades. Para este caso, a estrutura de dados “grafo” é a mais apropriada.

36
Q

O que são estruturas de dados “heterogêneas”?

A

São conjuntos de dados formados por tipos de dados diferentes.

37
Q

O que é um “registro”?

A

É uma estrutura de dados que pode ser composta de vários campos/elementos/componentes e cada um deles pode ser de um tipo diferente.
O programador nessa estrutura deve de dado em dado especificar qual o tipo será utilizado no campo declarado antes de utilizar a estrutura.

38
Q

Qual o pseudocódigo da declaração dos tipos de um registro?

A

nome_da_variavel:registro
Inicio
nome_campo_1:tipo_campo_1
nome_campo_2:tipo_campo_2

Fimregistro

39
Q

Qual o pseudocódigo para acessar/manipular um registro? e para fazer a leitura, escrever e definir o valor de um campo em específico?

A

varReg.campo
- leitura: leia(Ficha_Funcionario.matricula)
- escrever: escreva(Ficha_Funcionario.nome)
- definir valor de um campo: Ficha_Funcionario.cargo <- “gerente”

40
Q

O seguinte código apresenta um dangling pointer, memory leak (vazamento de memória), ambos ou nenhum? Por quê?

int main(){
int x[5];
return 0;
}

A

Nenhum dos dois. Memory leak é um problema causado por mau uso de alocação dinâmica. Dangling pointer é um problema causado por mau uso de ponteiros. O código em questão não utiliza nenhum dos dois recursos.

41
Q

O seguinte código apresenta um dangling pointer, memory leak (vazamento de memória), ambos ou nenhum? Por quê?

int *funcao(){
int *x = malloc (3 * sizeof(int));
free(x);
return x;
}

A

O código apresenta um dangling pointer. A função aloca memória para a variável x e a libera. Mesmo assim, retorna o ponteiro apontando para a primeira posição (que já foi liberada pelo sistema). Isso cria uma situação perigosa para o programa caso o usuário decida manipular a variável para a qual x aponta.

42
Q

O seguinte código apresenta um dangling pointer, memory leak (vazamento de memória), ambos ou nenhum? Por quê?

int funcao(){
int *x = malloc (3 * sizeof(int));
x = NULL;
return 2;
}

A

O código apresenta um vazamento de memória. Apesar de o ponteiro x ter sido corretamente definido para NULL, a memória reservada para ele não foi liberada e continuará reservada até o fim da execução do programa. Isso pode se tornar problemático, especialmente se essa função for chamada várias vezes durante a execução.

43
Q

Ponteiros são um recurso disponível na linguagem C que não está disponível na maioria das linguagens de alto nível como Python, Java e JavaScript. Ainda assim, em alguns algoritmos nessas linguagens, vemos variáveis sendo chamadas de ponteiros mesmo não sendo ponteiros propriamente ditos. Em que situações isso acontece? Por que adotou-se essa convenção?

A

Ao construir um algoritmo em C que explora um array e retorna um valor desconhecido (por exemplo, o maior elemento do array), é comum declarar uma variável auxiliar do tipo ponteiro que armazena o endereço do maior elemento encontrado até então. Linguagens que não possuem um tipo ponteiro usam uma estratégia parecida, geralmente usando a posição do array.

Se tornou uma convenção chamar esse tipo de variável auxiliar de ponteiro para simplificar a comunicação e permitir que essas estratégias sejam pensadas independentemente dos recursos da linguagem.