Tôi mới bắt đầu học C và khi thực hiện một ví dụ về việc chuyển con trỏ sang con trỏ làm tham số của hàm, tôi đã gặp một vấn đề.
Đây là mã mẫu của tôi:
#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;
}
Vấn đề xảy ra trong dòng 16, khi tôi sửa đổi *ptr+=1thành *ptr++. Kết quả dự kiến sẽ là toàn bộ mảng và số 1 nhưng khi tôi sử dụng *ptr++kết quả là 0.
Có bất kỳ sự khác biệt giữa +=1và ++? Tôi nghĩ rằng cả hai đều giống nhau.
allocateIntArraylà một tên xấu vì có vẻ như bạn malloclà mảng từ hàm, nhưng bạn thì không. Tôi đề nghị fillIntArraythay thế. 2) Bạn không sử dụng giá trị trả về của allocateIntArray. Tôi đề nghị bạn thay đổi loại trả lại thành void. 3) Không nên if (ptr != NULL)chức năng increasePointerđược if (*ptr != NULL)? 4) Các diễn viên trong malloclà không cần thiết. Xem bình luận của Sourav ở trên. 5) Điều này: for (int i = 0; i < 10; i++){ printf("%d\n", p1[i]); }và printf("%d\n", *p1); p1--;cần được đính kèm if(p1 != NULL). 6) string.hkhông được sử dụng.
p+=1giống như ++p, không thíchp++
string.