Проблема с визуализацией стека и кучи

#c #pointers

#c #указатели

Вопрос:

Я приношу извинения, если это слишком много кода для публикации, я удалю это, если это так. Мой приведенный ниже код компилируется и работает нормально, но я не уверен, выделяю ли я память в правильных местах. В частности, задачи 7 и 8. Задача 7 должна представлять собой массив из 10 указателей, выделенных в стеке, причем каждый указатель ссылается на 10 уникальных экземпляров, выделенных в куче. Задача 8 должна представлять собой один указатель, выделенный в стеке, причем указатель ссылается на массив из 10 экземпляров, выделенных в куче. У меня такое чувство, что я выполнил задания 7 и 8 задом наперед. Как вы, вероятно, можете догадаться, это задание, и я не ищу прямых ответов. Я просто хотел бы знать, нахожусь ли я на правильном пути для выполнения задач 7 и 8.

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

#define SIZE 10


/* Task 1 -- add typedef and rename to Point3d */

typedef struct POINT_3D
{
    int x_cord;
    int y_cord;
    int z_cord;
} Point3d;

/*Add function prototypes here*/


void init_Point1(Point3d* pt);

Point3d init_Point2(Point3d pt);

void PrintPoint1 (Point3d *pt);

void PrintPoint2(Point3d pt);


int main()
{
    int i;
    Point3d pt1;
    /* Task 2 -- using proper operator give values (5,4,2) to pt1
       and use the proper Print function to print it */
    pt1.x_cord = 5;
    pt1.y_cord = 4;
    pt1.z_cord = 2;

    printf("Printing Point3d:");
    PrintPoint1(amp;pt1);

    /*Task 3 -- Declare a pointer of type Point3d named ptr1*/
    Point3d  *ptr1;


    /*Task 4 -- Allocate memory for ptr1 and initialize it by
    calling init_Point1() function and use the proper Print function to print it */
    ptr1 = (Point3d*) malloc(sizeof(Point3d));
    init_Point1(ptr1);

    printf("Printing Point3d:");
    PrintPoint1(ptr1);

    //Declaring second variable pt2

    Point3d pt2;

    /*Task 5 and 6 -- Compelete init_Point2 function and
     call it with pt2 to create a point with random coordinates)
     , use the proper Print function to print it*/
    init_Point2 (pt2);


    printf("Printing Point3d:");
    PrintPoint2(pt2);

/************************************************/
/*************** Part 2 *************************/
/************************************************/
    /* All three variables p1, p2, and p3 are intended to be used as *
     * some form of array of the struct type declared above.         */

    Point3d p1[SIZE];
    Point3d* p2[SIZE];
    Point3d* p3;




    printf ("Calling init_Point1()n");
    for (i = 0 ; i < SIZE;   i)
    {
        printf ("For position %dn", i);
        init_Point1 (amp;p1[i]);
        PrintPoint1(amp;p1[i]);
        //PrintPoint2(p1[i])
    }


/*Task 7 -- Repeat the same steps for array p2, you must call a
   proper init function and display the results by calling Print function */

/***********************************/
/* p2 : Declare, Initialize, Print */
/***********************************/

    printf ("Calling init_Point1()n");
    for ( i = 0; i < SIZE; i  )
    {
        p2[i] = (Point3d*) malloc(sizeof(Point3d));
        printf ("For position %dn", i);
        init_Point1 (p2[i]);
        PrintPoint1 (p2[i]);
    }





/* Task 8 -- p3 is a single pointer that must refer to an array of 10 instances
   allocated on the heap. Repeat the previous steps for p3 by initializing and
  printing using proper functions*/

/***********************************/
/* p3 : Declare, Initialize, Print */
/***********************************/

p3 = (Point3d*) malloc(sizeof(Point3d)*SIZE);


    printf ("Calling init_Point1()n");
    for ( i = 0; i < SIZE; i  )
    {
        printf ("For position %dn", i);
        init_Point1 (amp;p3[i]);
        PrintPoint1 (amp;p3[i]);
    }




    return 0;
}


/************************/
/* function definitions */
/************************/


void init_Point1 (Point3d *pt)
{
    pt->x_cord = rand() % 100;
    pt->y_cord = rand() % 1000;
    pt->z_cord = rand() % 100;

}

/* Task 5 - write init_Point2() function definition */

Point3d init_Point2 (Point3d pt)
{
    pt.x_cord = rand() % 100;
    pt.y_cord = rand() % 1000;
    pt.z_cord = rand() % 100;

    return pt;
}



void PrintPoint1 (Point3d *pt)
{
    printf("t(x %d , y %d , z  %d ) t", pt->x_cord, pt->y_cord, pt->z_cord);
    printf("n");

}

void PrintPoint2 (Point3d pt)
{

    printf("t(x %d , y %d , z  %d ) t", pt.x_cord, pt.y_cord, pt.z_cord);
    printf("n");

}
  

Комментарии:

1. Ваше использование стека против кучи выглядит правильным. Вообще говоря, стек означает локальную переменную, а куча означает динамически распределяемую с malloc (или аналогичной функцией). Но для задачи 7 вы не выполнили «каждый указатель, ссылающийся на 10 уникальных экземпляров, выделенных в куче». p2[i] = (Point3d*) malloc(sizeof(Point3d)); выделяет только один элемент, а не 10.

2. Я согласен с @kaylum, за исключением того, что вы выполняете задание 7 по мере необходимости. У вас есть malloc в цикле, который выполняется 10 раз, так что вы действительно получите 10 уникальных экземпляров.

3. @lxop Возможно, ты прав. Но в вопросе говорится: каждый указатель . То есть каждый указатель должен содержать 10 элементов.

4. Я думаю, вам нужно создать резервную копию и сначала запустить задачу 5. Я попытался скомпилировать ваш код, и появилось одно предупреждение, в котором говорится, что pt2 не инициализируется при передаче в init_Point2 . Если вы не увидели это предупреждение, вам нужно повысить уровень предупреждения, например, использовать опции -Wall -Wextra -Werror с помощью gcc или clang. Чтобы доказать себе, что код не работает, измените rand() вызовы в init_Point2 на жестко закодированные числа, например 42, 750 и 37, а затем посмотрите, что печатает ваш код.

5. @kaylum интересно, это еще один способ прочитать это. Однако, поскольку в нем не говорится, что каждый указатель указывает на массив из 10 уникальных экземпляров, наверняка это должно быть так, как я это интерпретировал? Один указатель не может указывать на 10 объектов одновременно.