мелкая копия не создаст новую ссылку, но глубокая копия создаст новую ссылку. Вот программа для объяснения глубокой и мелкой копии
public class DeepAndShollowCopy {
int id;
String name;
List<String> testlist = new ArrayList<>();
/*
// To performing Shallow Copy
// Note: Here we are not creating any references.
public DeepAndShollowCopy(int id, String name, List<String>testlist)
{
System.out.println("Shallow Copy for Object initialization");
this.id = id;
this.name = name;
this.testlist = testlist;
}
*/
// To performing Deep Copy
// Note: Here we are creating one references( Al arraylist object ).
public DeepAndShollowCopy(int id, String name, List<String> testlist) {
System.out.println("Deep Copy for Object initialization");
this.id = id;
this.name = name;
String item;
List<String> Al = new ArrayList<>();
Iterator<String> itr = testlist.iterator();
while (itr.hasNext()) {
item = itr.next();
Al.add(item);
}
this.testlist = Al;
}
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Oracle");
list.add("C++");
DeepAndShollowCopy copy=new DeepAndShollowCopy(10,"Testing", list);
System.out.println(copy.toString());
}
@Override
public String toString() {
return "DeepAndShollowCopy [id=" + id + ", name=" + name + ", testlist=" + testlist + "]";
}
}
Благодаря Сержу, я смог собрать свой код, который приведен ниже.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
// create a struct, call it pupils
typedef struct
{
char *name;
char *dorm;
}
pupils;
int main(void)
{
// Allocate space for students - generally dynamic, here static
int enrollment = 2;
// create variable 'idinfo', which contains (enrollment) number of structs of type pupils
pupils idinfo[enrollment];
// Prompt for students' names and dorms
for (int i = 0; i < enrollment; i++)
{
// allocate memory for idinfo[i] pointers:
idinfo[i].name = malloc(20);
idinfo[i].dorm = malloc(20);
printf("Enter student %d's Name ", i+1);
scanf("%19s", idinfo[i].name);
printf("Enter student %d's dorm ", i+1);
scanf("%19s", idinfo[i].dorm);
}
// Print students' names and dorms
for (int i = 0; i < enrollment; i++)
{
printf("%s is in %s.\n", idinfo[i].name, idinfo[i].dorm);
}
// free allocated memory
for (int i = 0; i < enrollment; i++)
{
free(idinfo[i].name);
free(idinfo[i].dorm);
}
}
Предполагая, что вы не хотите использовать магию cs50, вам придется распределять и освобождать строки. Из вашего кода я также предполагаю, что входные строки должны быть короче 20 символов. Следующий код даже не гарантирует, что это правда, но также не даст сбоя, а просто даст неожиданные результаты.
Код может быть:
int main(void)
{
// Allocate space for students - generally dynamic, here static
int enrollment = 2;
// create variable 'idinfo', which contains (enrollment) number of structs of type pupils
pupils idinfo[enrollment];
// Prompt for students' names and dorms
for (int i = 0; i < enrollment; i++)
{
// allocate memory for idinfo[i] pointers:
idinfo[i].name = malloc(20);
scanf("%19s", idinfo[i].name);
idinfo[i].dorm = malloc(20);
scanf("%19s", idinfo[i].dorm);
}
// Print students' names and dorms
for (int i = 0; i < enrollment; i++)
{
printf("%s is in %s.\n", idinfo[i].name, idinfo[i].dorm);
}
// free allocated memory
for (int i = 0; i < enrollment; i++)
{
free(idinfo[i].name);
free(idinfo[i].dorm);
}
}
Вы, вероятно, хотите что-то вроде этого:
#include <cs50.h> // needed for get_xxx functions and other cs50 stuff
...
// Prompt for students' names and dorms
for (int i = 0; i < enrollment; i++)
{
idinfo[i].name = get_string("Name: ");
idinfo[i].dorm = get_string("Dorm: ");
}
Но это должно быть отражено в документации, которую вам дали.
Мой совет - вообще не использовать scanf
, а только методы ввода cs50 get_xxx
.
И будьте осторожны: CS50 string
- это не настоящий «строковый» тип, а просто то же самое, что и char *
.