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+=1
thà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 +=1
và ++
? Tôi nghĩ rằng cả hai đều giống nhau.
allocateIntArray
là một tên xấu vì có vẻ như bạn malloc
là mảng từ hàm, nhưng bạn thì không. Tôi đề nghị fillIntArray
thay 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 malloc
là 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.h
không được sử dụng.
p+=1
giống như ++p
, không thíchp++
string
.