Respostas Lista 1 - Ponteiros e Alocação Dinâmica
1.
a) &
b) *
c) endereço
d) endereço
e) 0
2.
x = 16
y = 24
z = 17
3.
- As variáveis x e y não receberam nenhum valor. Irá imprimir lixo de memória.
-
ptr_y deve receber o endereço de y, e não seu valor.
Correção: ptr_y = &y; -
Para desreferenciar um ponteiro void, é necessário fazer
uma operação de casting.
Correção: printf("x: %d\n", *(int*)ptr_x);
4.
A função scanf necessita do endereço de memória da variável para que o valor seja corretamente armazenado.
Em variáveis compostas, usar apenas o nome da variável (sem o operador [ ]) é equivalente ao endereço da primeira posição de memória. Outra forma seria &(str[0])
5.
void swap(int *a, int *b) {
int aux;
aux = *a;
*a = *b;
*b = aux;
}
6.
int *vetor;
int n_elementos;
// Alocando o vetor de inteiros:
vetor = (int*) malloc(n_elementos * sizeof(int));
// Liberando a memória alocada:
free(vetor);
7.
int **matriz;
int n_linhas;
int n_colunas;
int i;
// Alocando um vetor de ponteiros:
matriz = (int**) malloc(n_linhas * sizeof(int*));
// Para cada ponteiro do vetor, aloca um vetor de inteiros:
for(i = 0; i < n_linhas; i++) {
matriz[i] = (int*) malloc(n_colunas * sizeof(int));
}
// Liberando as memórias alocadas:
for(i = 0; i < n_linhas; i++) {
free(matriz[i]);
}
free(matriz);
8.
#include <stdlib.h>
#include <string.h>
char *concatena(char *str1, char *str2) {
char *str3;
int len1;
int len2;
int len3;
int i;
len1 = strlen(str1);
len2 = strlen(str2);
len3 = len1 + len2 + 1; // +1 devido ao caractere \0
str3 = (char*) malloc(len3 * sizeof(char));
// Insere a primeira string
for(i = 0; i < len1; i++) {
str3[i] = str1[i];
}
// Insere a segunda string
for(i = 0; i < len2; i++) {
str3[len1 + i] = str2[i];
}
str3[len3] = '\0';
return str3;
}
9.
#include <stdlib.h>
#include <string.h>
char *inverter(char *str) {
int i, j;
int len;
char *inv;
len = strlen(str);
inv = (char*) malloc(len * sizeof(char));
for(i = len - 1, j = 0; i >= 0; i--, j++) {
inv[j] = str[i];
}
inv[len] = '\0';
return inv;
}