Fala pessoal..
Estava estudando C aqui e resolvi fazer um programinha de soma, bem simples.. eu passo no terminal o números e ele me devolve a soma. Dava para fazer tudo na main.. mas decidi criar uma função para o caso de animar a fazer outras operações além da soma e também treinar o uso de ponteiros.. ai que veio o problema. O programa está assim:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int sum(int n, char **args[]);
int main(int argc, char *argv[])
{
if (argc < 3) {
puts("usage: calc n1 n2");
exit(1);
}
int result;
result = sum(argc, &argv);
printf("%d\n", result);
return 0;
}
int sum(int n, char **args[])
{
int result = 0;
for (int i = 1; i < n; i++)
result += strtol((*args)[i], NULL, 10);
return result;
}
O problema está na linha 26:
result += strtol((*args)[i], NULL, 10); // aqui é versão que funciona
Primeiro eu fiz o strtol sem o enclausurar o *args nos parênteses.. da seguinte forma:
result += strtol(*args[i], NULL, 10); // versão com falha na segmentação.
O Compilador aceitou, usei o GCC default para compilar.. porém em execução deu Segmentation fault:
Program received signal SIGSEGV, Segmentation fault.
0x0000555555555201 in sum (n=4, args=0x7fffffffdfe0) at err-sum.c:26
26 result += strtol(*args[i], NULL, 10);
Eu lembrei que para declarar uma ponteiro para função é necessário os parênteses devido a regra de precedência:
int (*nome)(parametro1, ..) //ponteiro para função
int * nome(parametro1, ..) // função que retorna um ponteiro para um inteiro.
Então, por puro chute, eu resolvi colocar os parênteses e tudo funcionou lindamente… o problema é que não entendi o motivo que eu preciso usar esse parênteses ai. Na minha cabeça ao fazer *args[i] eu já estaria “desreferenciando” o suficiente.
Alguém consegue me explicar? Tentei buscar nos materiais que eu tenho mas não consegui encontrar a explicação. Dá uma agonia qdo o negócio funciona e eu não entendo o movito.. kkkk
Valeu
Luciano.
Ps: O nome mais esquisito esse de desreferenciar...