ถามเรื่องการกำหนดค่าเริ่มต้นของ Array และการจองขนาดพื้นที่โดยใช้ malloc และ realloc ในภาษาซี

ผมมีคำถามอยากรบกวนสอบถาม 2 คำถามดังนี้ครับ

1. ผมเรียกใช้ฟังก์ชันดังข้างล่างต่อไปนี้ โดยก่อนหน้านี้ ผมมีฟังก์ชัน main() ซึ่งฟังก์ชัน main() จะกำหนดค่า no_user ผ่านทาง คำสั่ง scanf จากนั้นเรียกฟังก์ชัน test ซึ่งมีตัวแปร no_user เป็น parameter หนึ่ง

แต่เมื่อผมกำหนดให้  int stage[no_user] = {1}; ดังข้างล่างนี้ กลับมีข้อความ
error : variable-sized object may not be initialized

void test(int no_user)
{
   int stage[no_user] = {1};
....
}

ผมแก้ปัญหาเบื้องต้นโดยเขียนดังนี้

void test(int no_user)
{
   int stage[no_user];
....
}

และค่อยไปวนลูปเพื่อกำหนดค่าให้สมาชิกของ array stage ทุกตัวเท่ากับ 1

อยากทราบว่า พอจะมีทางอื่นไหมครับ ที่ผมไม่ต้องวนลูป และกำหนดค่าเริ่มต้นตอนประกาศตัวแปรอย่างได้เลย

2. หากผมมีตัวแปร array ซึ่งไม่ทราบขนาดที่แน่ชัด และขณะที่ Run program ขนาดของ array อาจจะเพิ่มขึ้นหรือลดลงได้

ผมจึงเลือกประกาศตัวแปรดังนี้
int *stage;

หากต้องการกำหนดให้ array stage มีสมาชิก 2 ตัว ผมจะใช้
stage = malloc(2 * sizeof(int));

ทีนี้ตอนที่ผมต้องการปรับขนาด array stage เพิ่มขึ้นเป็น 5 ตัว ผมใช้
stage = realloc(stage, 5 * sizeof(int));

ส่วนใหญ่ผมจะเห็นการใช้งาน realloc ตอนที่จะเพิ่มขนาด array แต่ยังไม่เคยเห็นตอนที่จะลดขนาด array
ผมจึงอยากรบกวนสอบถามว่า หากผมต้องการลดขนาด array stage จากสมาชิก 5 ตัว เป็นสมาชิก 3 ตัว ผมสามารถเรียกใช้คำสั่งต่อไปนี้ได้ไหมครับ
stage = realloc(stage, 3 * sizeof(int));
หรือมีวิธีการอื่น ๆ อีกไหมครับ ในการเพิ่มและลดขนาด array

ขอบคุณล่วงหน้าสำหรับคำตอบครับ
แสดงความคิดเห็น
โปรดศึกษาและยอมรับนโยบายข้อมูลส่วนบุคคลก่อนเริ่มใช้งาน อ่านเพิ่มเติมได้ที่นี่