#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 объектов одновременно.