Comecei a estudar C e, ao fazer um exemplo sobre a passagem de ponteiro para ponteiro como parâmetro de uma função, encontrei um problema.
Este é o meu código de exemplo:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int* allocateIntArray(int* ptr, int size){
if (ptr != NULL){
for (int i = 0; i < size; i++){
ptr[i] = i;
}
}
return ptr;
}
void increasePointer(int** ptr){
if (ptr != NULL){
*ptr += 1; /* <----------------------------- This is line 16 */
}
}
int main()
{
int* p1 = (int*)malloc(sizeof(int)* 10);
allocateIntArray(p1, 10);
for (int i = 0; i < 10; i++){
printf("%d\n", p1[i]);
}
increasePointer(&p1);
printf("%d\n", *p1);
p1--;
free(p1);
fgets(string, sizeof(string), stdin);
return 0;
}
O problema ocorre na linha 16, quando modifico *ptr+=1
para *ptr++
. O resultado esperado deve ser toda a matriz e o número 1, mas quando eu uso *ptr++
o resultado é 0.
Existe alguma diferença entre +=1
e ++
? Eu pensei que os dois são iguais.
allocateIntArray
é um nome ruim, pois parece que você é malloc
o array da função, mas não o faz. Eu sugiro em fillIntArray
vez disso. 2) Você não utiliza o valor de retorno de allocateIntArray
. Eu sugiro que você altere o tipo de retorno para void
. 3) Não deve if (ptr != NULL)
, em função de increasePointer
ser if (*ptr != NULL)
? 4) O elenco não malloc
é necessário. Veja o comentário de Sourav acima. 5) Isto: for (int i = 0; i < 10; i++){ printf("%d\n", p1[i]); }
e printf("%d\n", *p1); p1--;
precisa ser incluído if(p1 != NULL)
. 6) string.h
não está sendo usado.
p+=1
é como ++p
, não é comop++
string
.