Я только начал изучать 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
.