การจัดการอาร์เรย์ใน c [ซ้ำกัน]

ฉันมีปัญหาในการใช้พอยน์เตอร์และอาร์เรย์ใน C งานง่ายมาก ฉันมีฟังก์ชันที่แปลงตัวเลขเป็นอาร์เรย์ int จากนั้นส่งตัวชี้กลับไปยังอาร์เรย์นี้ ณ จุดนี้ ฉันต้องกำหนดพอยน์เตอร์นี้ให้กับอาร์เรย์ของพอยน์เตอร์

สิ่งที่ฉันได้รับคือตัวเลขจำนวนมากตามลำดับ ดังนั้นฉันคิดว่านั่นเป็นที่อยู่ของพอยน์เตอร์ ปัญหาคือฉันต้องดูค่าที่จัดเก็บไว้ในอาร์เรย์เหล่านั้น ไม่ใช่ที่อยู่...

โปรแกรมคอมไพล์โดยไม่มีคำเตือนหรือข้อผิดพลาด

//-----Function to convert single digits-----
int* convertToBits(int digitToConvert) 
{
    int binaryDigit[8];
    int k;
    for (int i = 7; i >= 0; i--) {
        k = digitToConvert >> i;

        if (k & 1) {
            binaryDigit[i] = 1;
            //printf("1");
        }
        else {
            binaryDigit[i] = 0;
            //printf("0");
        }
    }

    return binaryDigit;
}

//-----Function to store single digits-----
void setupDigit(int temperature) 
{
    int* displayDigit[4];
    if (temperature >= 0) 
    {
      for (int i = 0; i < 4; i++) {
        //displayDigit[i] = convertToBits(takeSingledDigit(temperature));
          int* pointTo = convertToBits(takeSingledDigit(temperature));
          displayDigit[i] = pointTo;
          for (int j = 0; j < 8; j++) {

              printf("%d", *(displayDigit[i]) + j);

          }
        printf("\n");
        temperature /= 10;
      }
    }
    else 
    {
        for (int i = 0; i < 3; i++) {
            //displayDigit[i] = convertToBits(takeSingledDigit(temperature));
            int* pointTo = convertToBits(takeSingledDigit(temperature));
            displayDigit[i] = pointTo;
            for (int j = 0; j < 8; j++) {

                printf("%d", *(displayDigit[i]) + j);

            }
            printf("\n");
            temperature /= 10;
        }
        displayDigit[3] = minusChar;
    }

person Simone Nardone    schedule 16.02.2020    source แหล่งที่มา
comment
จะเกิดอะไรขึ้นกับ int binaryDigit[8]; เมื่อฟังก์ชันกลับมา (คำใบ้: poof!) คุณไม่สามารถส่งคืนตัวชี้ไปยังอาร์เรย์ที่ประกาศในเครื่องได้ เมื่อส่งคืนฟังก์ชันสแต็กจะถูกทำลาย (ปล่อยเพื่อนำกลับมาใช้ใหม่) อาร์เรย์ที่ประกาศในเครื่องของคุณอยู่ในฟังก์ชันสแต็กนั้น ตัวชี้ที่คุณส่งคืน - ตอนนี้ชี้ไปยังที่อยู่ที่ไม่ถูกต้อง - กะเทย! ระบุ binaryDigit เป็นพารามิเตอร์ให้กับฟังก์ชันของคุณ หรือจัดสรรด้วย mailloc แล้วส่งคืนพอยน์เตอร์   -  person David C. Rankin    schedule 16.02.2020
comment
return binaryDigit ให้พฤติกรรมที่ไม่ได้กำหนดไว้ (ที่อยู่ที่ส่งคืนไม่ถูกต้องนอกฟังก์ชัน อาจมีปัญหาอื่น ๆ อยู่ แต่ปัญหานั้นโดดเด่นจริงๆ   -  person John3136    schedule 16.02.2020
comment
ครั้งแรก: ขอบคุณ!. จะเกิดอะไรขึ้นถ้าฉันกำหนด binarDigit เป็นตัวแปรโกลบอล?   -  person Simone Nardone    schedule 16.02.2020
comment
หากคุณต้องการจัดเก็บพอยน์เตอร์ที่ส่งคืนในคอนเทนเนอร์เพื่อการใช้งานต่อเนื่อง (เช่น อาร์เรย์ของพอยน์เตอร์) คุณควรจัดสรรพื้นที่เก็บข้อมูลด้วย malloc() และส่งคืนพอยน์เตอร์นั้น อย่าเข้าใกล้ระดับโลกเว้นแต่จะไม่มีทางเลือกอื่น บันทึกสิ่งที่ฟังก์ชันของคุณทำเพื่อให้ผู้ใช้เข้าใจว่าพื้นที่เก็บข้อมูลที่จัดสรรอาจต้องได้รับการปลดปล่อยในบางจุด   -  person Martin James    schedule 16.02.2020
comment
โอ้.. และอย่าถูกล่อลวงให้ใช้อาเรย์แบบคงที่เช่นกัน เช่นเดียวกับระดับโลก คุณอาจจะจบลงที่สิ่งที่เป็นสีน้ำตาล หากคุณแบ่งพื้นที่ ฟังก์ชันของคุณจะทำงานและมีการเรียกซ้ำ/เธรดอย่างปลอดภัย ฟังก์ชั่นที่ทำงานอย่างถูกต้องไม่ว่าจะถูกเรียกจากที่ใดหรืออย่างไรในพื้นที่ผู้ใช้ ทิ้งความรู้สึกคลุมเครือที่ดีและอบอุ่น :) วิธีเดียวที่ 'ดีกว่า' คือส่งผ่านอาร์เรย์เป็นอาร์กิวเมนต์ ส่งผลให้ฟังก์ชันกลับเข้าใหม่ที่จะ ทำงานอย่างถูกต้องแม้ว่าจะถูกเรียกโดยตัวจัดการขัดจังหวะ :)   -  person Martin James    schedule 16.02.2020