ฉันเพิ่งเริ่มศึกษา 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
เป็นสิ่งที่ไม่จำเป็น ดูความคิดเห็นของ Sourav ด้านบน 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
ไว้