Właśnie zacząłem uczyć się C i kiedy robiłem jeden przykład dotyczący przekazywania wskaźnika do wskaźnika jako parametru funkcji, znalazłem problem.
Oto mój przykładowy kod:
#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;
}
Problem pojawia się w linii 16, kiedy modyfikuję *ptr+=1
do *ptr++
. Oczekiwanym wynikiem powinna być cała tablica i liczba 1, ale kiedy używam *ptr++
wyniku, to 0.
Czy jest jakaś różnica między +=1
a ++
? Myślałem, że obaj są tacy sami.
allocateIntArray
to zła nazwa, ponieważ wydaje ci malloc
się tablica z funkcji, ale tak nie jest. Proponuję fillIntArray
zamiast tego. 2) Nie używasz zwracanej wartości allocateIntArray
. Proponuję zmienić typ zwrotu na void
. 3) nie powinna if (ptr != NULL)
w funkcję increasePointer
być if (*ptr != NULL)
? 4) Wrzucenie malloc
jest zbędne. Zobacz komentarz Sourav powyżej. 5) To: for (int i = 0; i < 10; i++){ printf("%d\n", p1[i]); }
i printf("%d\n", *p1); p1--;
musi być zawarte w if(p1 != NULL)
. 6) string.h
jest nieużywany.
p+=1
jest jak ++p
, a nie jakp++
string
.