Skip to content

Instantly share code, notes, and snippets.

@PinheiroCosta
Last active October 28, 2022 16:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save PinheiroCosta/c432deb54e9173cd82b0dbcd24f7c4cd to your computer and use it in GitHub Desktop.
Save PinheiroCosta/c432deb54e9173cd82b0dbcd24f7c4cd to your computer and use it in GitHub Desktop.
Cuidados ao desenvolver na linguagem C

Ponteiros de string

O ponteiro de string aponta o processador para o primeiro elemento (endereço de memória) de um vetor para que ele leia os dados até que encontre um byte nulo (NULL, 0, '\0). Portanto, certifique-se de que a variável de destino possua espaço suficiente para receber o dado.

char *ditado = "O rato roeu a roupa\0 do rei de roma";	  // output: O rato roeu a roupa
char ditado[10] = "O rato roeu a roupa do rei de roma";  	// output: O rato roe

Inicialização de variáveis

Ao declarar uma variável, verifique se ela foi atribuída com um valor inicial. Isso previne que a variável seja valorada com lixo de memória.

int tamanho = 0;
char nome[25] = "";

Evite strcpy, strcat, e sprintf

Cuidado ao gravar dados em pointeiro. Certifique-se de que a variável de destino possui espaço suficiente para armazenar os valores e não invadir espaço de memória. Para isso utilize funções que consideram o tamanho da variável como snprintf(), strncat(), e snprintf().

char nome_completo[30] = "";
char *nome = "Adriane";
char *sobrenome = "Galisteu";
snprintf(nome_completo, sizeof(nome_completo), "%s %s", nome, sobrenome); 

Alocação Estática de memória

Ao definir o tamanho de bytes de uma variável, certifique-se de que tenha deixado uma margem a mais sobrando, para caso ocorra alguma mudança que a regra de negócio precise atualizar. Um exemplo é a quantidade de dígitos dos números de celular que até 2012 possuiam apenas 8 dígitos, e pode variar dependendo do contexto.

char celular[20] = "9804-2245";
char celular[20] = "+55 (51) 9804-2245";

Alocação dinâmica de memória (malloc, calloc, realloc, e free)

Caso tenha utilizado alguma função de alocação dinâmica, certifique-se de que tenha liberado o espaço reservado quando a variável já não for mais utilizada. e evitar vazamento de memória.

int *ptr;
ptr = (int *)malloc(sizeof(ptr));	//aloca
if (ptr == NULL)
{
	printf("ERROR: could not be allocated: memory overflow\n");
	return 1;
}
*ptr = 10;
printf("%d\n", *ptr);
free(ptr)				//dealoca

Gravação de dados via parâmetro de função

Cuidado ao gravar dados em variáveis via paramêtro. Para proteção, o correto é ter também na entrada da função o tamanho da variável onde o dado será gravado.

void converte_em_reais(char *valor_produto, char *buf, int buf_len){
    snprintf(buf, buf_len, "R$ %s", valor_produto);
}

int main()
{
    char *valor_produto = "29,90";
    char valor_reais[10] = "";
    converte_em_reais(valor_produto, valor_reais, sizeof(valor_reais));
    printf("%s", valor_reais);

    return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment