การกำหนดอาร์เรย์ที่ผิดปกติ 2 มิติด้วย malloc

ฉันมีคำถามฝึกหัดนี้:

กำหนดอาร์เรย์ที่ไม่ปกติแบบ 2 มิติด้วย malloc ของ ints โดยที่ค่า dim = 4 และค่าภายใน = 10,11,12,13 (คำแนะนำ: ใช้ for loop)

ดังนั้นฉันจึงรู้ว่าฉันสามารถเขียนอาร์เรย์ 2 มิติที่ผิดปกติด้วย malloc ของ ints เช่นนี้

int (*อาร์เรย์)[20] = malloc((ขนาดของ *อาร์เรย์) * 10);

นั่นคงเป็นสำหรับอาร์เรย์ 10x20 ที่ฉันเชื่อด้วย amlloc

ฉันไม่แน่ใจว่าจะใช้ for loop เพื่อเปลี่ยนขนาดภายในจาก 10 เป็น 11 เป็น 12 เป็น 13 ได้อย่างไร ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมขอบคุณ!

int j;

for (int k = 0; k < 4; k++ )
{
    for ( j = 10; j < 14; j++ )
    {
        int (*array)[4] = malloc((sizeof *array) * j)
    }
}

ว่าแต่มันใกล้จะถูกต้องแล้วเหรอ?


person user3234203    schedule 25.01.2014    source แหล่งที่มา
comment
เพิ่ม 1 ไปที่ค่าสิ้นสุดของลูป for ภายในแต่ละครั้งที่คุณดำเนินการหนึ่งครั้งของลูป for ภายนอก   -  person Robert Harvey    schedule 25.01.2014
comment
สิ่งที่ฉันเพิ่มเข้าไปใกล้จะถูกต้องหรือไม่?   -  person user3234203    schedule 25.01.2014
comment
ใช่ คุณแค่ต้องการบางอย่างเช่น j < 10 + k ใน for ที่สอง ดูว่ามันทำงานอย่างไร?   -  person Robert Harvey    schedule 25.01.2014
comment
ด้วยเหตุผลบางอย่าง ฉันได้รับข้อผิดพลาดภายใต้ malloc มันบอกว่าค่าประเภท void ไม่สามารถใช้เพื่อเริ่มต้นเอนทิตีประเภท int int(*)[4]   -  person user3234203    schedule 25.01.2014
comment
มันใช้งานได้ก่อนที่คุณจะทำการเปลี่ยนแปลงที่ฉันแนะนำหรือไม่?   -  person Robert Harvey    schedule 25.01.2014
comment
ไม่ไม่ได้จริงๆ มันมีข้อผิดพลาดเดียวกันทั้งสองครั้ง   -  person user3234203    schedule 25.01.2014
comment
โอเค คนที่มีความรู้ C ดีกว่าฉันจะต้องช่วยคุณแก้ไข malloc นั้น   -  person Robert Harvey    schedule 25.01.2014


คำตอบ (1)


สิ่งนี้ช่วยได้หรือไม่? หากเป็นเช่นนั้น โปรดแก้ไข http://en.wikibooks.org/wiki/C_Programming/Common_practices#Dynamic_multiDimension_arrays เพื่อให้นักเรียนคนถัดไปเข้าใจได้ง่ายขึ้น

#include <stdio.h>
#include <stdlib.h>

const int rows = 20;

int main(void) {
    int **some_data;
    // first, allocate a (column) Iliffe vector.
    some_data = malloc( (sizeof(*some_data)) * rows);
    int i=0;
    for(i = 0; i < rows; i++){
        // next, allocate each row.
        // For no good reason, make each row a different size.
        int columns = i+10;
        some_data[i] = malloc( (sizeof(**some_data)) * columns);
    };
    some_data[3][13] = 9;
    printf( "%d\n", some_data[3][13]);
    return 0;
}

หากคุณกำลังดูสิ่งนี้ผ่านระบบที่ถูกล็อคซึ่งดูเหมือนจะได้รับความนิยมอย่างอธิบายไม่ได้ในปัจจุบัน คุณอาจพบว่าเป็นการสะดวกที่จะเรียกใช้โค้ดด้านบนในคอมไพเลอร์ C ออนไลน์บางตัว เช่น http://ideone.com/ หรือ http://codepad.org/ หรือ http://www.compileonline.com/compile_c_online.php

person David Cary    schedule 25.01.2014