我正在尝试制作一个结构来记录一组人。出于某种原因,每当我输入此人的房间名称时,房间名称都会替换此人的名字。这在测试5的addResi函数中显示。
struct resi {
char *firstname;
char *lastname;
double stnscore;
char *roomName;
struct resi *next;
};
struct resi *head = NULL;
struct resi *current = NULL;
void printAll() {
struct resi *outer = head;
if (outer == NULL) {
printf("Emptyn"); fflush(stdout);
}
while (outer != NULL) {
printf("First Name: %s, Last Name: %s, Score: %lf, roomName: %sn", outer->firstname, outer->lastname, outer->stnscore, outer->roomName); fflush(stdout);
outer = outer->next;
}
}
void addResi(char *firstname, char *lastname, double stnscore, char *roomName) {
printf("test 0n"); fflush(stdout);
struct resi *link = (struct resi*) malloc(sizeof(struct resi));
printf("test 1 %sn", firstname); fflush(stdout);
strcpy(link->firstname, firstname);
printf("test 2 %sn", link->firstname); fflush(stdout);
strcpy(link->lastname, lastname);
printf("test 3n"); fflush(stdout);
link->stnscore = stnscore;
printf("test 4n"); fflush(stdout);
strcpy(link->roomName, roomName);
printf("test 5 %s %sn", link->firstname, link->roomName); fflush(stdout); //they shouldn't be the same.
link->next = head;
head = link;
}
int main (void)
{
int totalStud, tempX = 0;
char firTemp[21], lasTemp[21], roomTemp[21];
double scrTemp;
printf("How many residences?n"); fflush(stdout);
scanf("%d", &totalStud);
if (totalStud < 5) {
printf("The number %d is less than 5, please type a different numbern",
totalStud); fflush(stdout);
}
while (totalStud < 5) {
scanf("%d", &totalStud);
}
printf("type the residences with following formatnfirst name last name score roomn"); fflush(stdout);
for (tempX = 0; tempX < totalStud; tempX++) {
scanf("%20s %20s %lf %20s", firTemp, lasTemp, &scrTemp, roomTemp);
printf("test mid %s %s %lf %sn", firTemp, lasTemp, scrTemp,
roomTemp); fflush(stdout);
addResi(firTemp, lasTemp, scrTemp, roomTemp);
printAll();
}
}
如果我输入了"5",那么"Bob Billy 45.5 Jackson"最后一个输出应该看起来像"名字:Bob,姓氏:Billy,分数:45.500000,房间名:Jackson",但它显示为"名字:Jackson,姓氏:比利,分数:45500000,房间名称:Jackson">
resi
实际上并没有为名称保留空间,它只保留指向名称的指针。我所知道的最小变化是将char *firstname
更改为char firstname[256]
,对于resi
中的其他char *
字段也是如此。
resi
中的指针在内存中保存字符所在的位置,而不是字符本身。当您malloc
时,这些位置是未指定的——它们可以是任何东西。因此,strcpy
调用将字符放在内存中的某个位置,但我们不确定在哪里!
由于您还没有定义将这些字符放在哪里,我怀疑内存中的一些随机位置是重叠的,所以几个strcpy
调用将数据放在内存的同一部分。这可能会导致你所看到的行为。
幸运的是,它没有崩溃。这种行为是未定义的,因为您正在将firstname、lastname和roomname复制到所指向的任何内存中,而这些从未设置为任何有意义的内容。每当你用malloc分配内存时,在初始化之前,内存的内容基本上是随机的。如前所述,你可能可以通过使用数组定义(如firstname[256](来进行更改,但另一种解决方案是使用strdup而不是strcpy,这将生成字符串的副本。如果稍后删除结构的实例以避免内存泄漏,则需要释放此内存。