我一直很难搞清楚这段代码:
typedef struct student_grade sg;
sg *first = NULL;
sg *renew = NULL;
sg *temp = NULL;
int num;
float g;
char classname[12], fn[STR_LENS], ln[STR_LENS];
printf("Enter the classname (without spaces): ");
scanf("%11s", classname);
printf ("Enter the student's name and their grade. Enter 0 0 0 to quit. \n(FirstLast ##.#): ");
num = scanf("%11s %11s %f", fn, ln, &g);
while (fn[0] != '0')
{
if (num == 3)
{
renew = (sg*) malloc(sizeof(sg));
strncpy(renew->first_name, fn, STR_LENS-1);
strncpy(renew->last_name, ln, STR_LENS-1);
renew->grade = g;
renew->next = first; //next pointer to first
first = renew; //assign address of renew to first
}
else
{
return 1;
}
printf("Enter the student's name and their grade.Enter 0 0 0 to quit\n(First Last ##.#): ");
num = scanf("%11s %11s %f", fn, ln, &g);
}
特别是这部分:
renew = (sg*) malloc(sizeof(sg));
strncpy(renew->first_name, fn, STR_LENS-1);
strncpy(renew->last_name, ln, STR_LENS-1);
renew->grade = g;
renew->next = first; //next pointer to first
first = renew; //assign address of renew to first
为结构分配renew
,指向first
指针,该指针最初为NULL,first
被指定为renew
的相同地址,然后指向renew
到renew
的地址。在第二个循环之后,相同的first
显然会被克隆并指向first
的地址,然后renew
的地址被分配与克隆的let mainWindow;
let playerWindow;
app.on('window-all-closed', function() {
if (process.platform != 'darwin') {
app.quit();
}
});
app.on('ready', function() {
mainWindow = new BrowserWindow({
title: 'MasterGameApp',
x: 910,
y: 500,
width: 800,
height: 460,
show: true,
resizable: false,
transparent: false
});
playerWindow = new BrowserWindow({
title: 'playerView',
x: 2250,
y: 50,
width: 1005,
height: 540,
show: true,
transparent: false,
fullscreen : true
});
mainWindow.loadURL('http://localhost:8889');
mainWindow.setMenuBarVisibility(false);
mainWindow.setAutoHideMenuBar(true);
playerWindow.loadUrl('http://localhost:8889/playerView');
playerWindow.setMenuBarVisibility(false);
playerWindow.setAutoHideMenuBar(true);
mainWindow.on('closed', function() {
playerWindow.close();
playerWindow = null;
mainWindow = null;
});
});
相同的地址
没有一个加起来。
答案 0 :(得分:0)
没有发生renew
的克隆。每次迭代都会分配一块新的内存(这是malloc
调用正在做的事情)并更改renew
指针以引用这个新的内存。
答案 1 :(得分:0)
这是一个将新元素添加到链表开头的循环。
第一个scanf
读取了类名,而这就是它。然后,另一个scanf
将名字,姓氏和等级存储到3个变量中,然后开始while
循环:
每次代码用malloc
分配新元素的空间时,就会填充其3个字段(您没有显示struct student_grade
的定义,但我们可以推断它有字段{ {1}},first_name
和last_name
)将用户使用grade
插入的数据复制到其中,然后还有2行处理链接列表:我们是在开头插入,这意味着新元素将成为第一个元素。所以,scanf
确保我们创建的元素之后的元素(它不在列表中!)首先是当前(它将成为下一行的第二个元素) ),然后使用renew->next = first;
程序确保从现在起列表将从我们添加的元素开始。
在循环结束时,新的first = renew;
会询问有关另一个学生的数据,这些数据存储在与之前相同的变量中,以便在循环的下一次迭代中将它们复制到结构,它一直持续到用户插入0。
这里没有克隆。每次调用scanf
时,都会得到一个与前一个不同的新内存块,其地址暂时存储在malloc
中。由于每次都会覆盖renew
,并且您不想丢失它,因此您必须确保将其存储在某处:第一个元素的地址始终存储在renew
中,并且每个元素都将指针(first
)存储到下一个元素,这样就不会丢失任何地址。 next
每次都没有被克隆;相反,变量总是相同的,但它的值(地址)每次都会改变。
答案 2 :(得分:0)
在第二次循环之后,相同的更新'显然被克隆了......
首先没有克隆"module"
。为它分配了一个全新的内存空间。
您想将renew
添加到列表的开头。另一个指针(renew
)指向列表的开头。
first
- 使用此行,您基本上可以说“好”,从这一点开始renew->next = first;
将成为我列表中的第一项,其下一项将是实际的{{1} }。基本上renew
是我列表中的第0项。
first
- 您有renew
指针指向列表的开头。您还希望first = renew;
点指向列表的开头。因此,解决方案是将renew
指针设置为指向与first
指针相同的内存位置。现在,您的两个指针都将正确指向列表中的第一个项目。
first
基本上用作辅助指针。它有助于向列表中添加新项目。另一方面,first
指针是列表的重要组成部分。它的工作是指向列表中的第一个元素。