Я щойно почав вивчати C, і, роблячи один приклад про передачу вказівника на покажчик як параметр функції, я виявив проблему.
Це мій зразок коду:
#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;
}
Проблема виникає в рядку 16, коли я змінюю *ptr+=1
до *ptr++
. Очікуваний результат повинен бути весь масив і номер 1, але коли я використовую *ptr++
результат, це 0.
Чи є різниця між +=1
і ++
? Я подумав, що вони обоє однакові.
allocateIntArray
- це неправильне ім'я, оскільки, здається, ви malloc
масив з функції, але ви цього не робите. Я пропоную fillIntArray
замість цього. 2) Ви не використовуєте повернене значення allocateIntArray
. Я пропоную вам змінити тип повернення на void
. 3) Не слід чи if (ptr != NULL)
в функції increasePointer
бути if (*ptr != NULL)
? 4) У ролях malloc
не потрібно. Дивіться коментар Сурава вище. 5) Це: for (int i = 0; i < 10; i++){ printf("%d\n", p1[i]); }
і printf("%d\n", *p1); p1--;
його потрібно докласти if(p1 != NULL)
. 6) string.h
не використовується.
p+=1
це як ++p
, не такp++
string
.