谢谢
#import <Foundation/Foundation.h>
typedef struct User {
char* userName;
int userAge;
}User;
int count;
void list();
void addUserInToList(User* db, int age, char* name);
main () {
count = 0;
int age ;
char name[5] ;
User list [] = {
};
for (int i = 0; i<2; i++) {
NSLog(@"Name Please : ");
scanf("%s",name);
NSLog(@"Age Please :");
scanf("%d",&age);
addUserInToList(&list[count], age, name);
count++;
}
NSLog(@"Check :%d :%s",list[0].userAge,list[0].userName);
NSLog(@"Check :%d :%s",list[1].userAge,list[0].userName);
}
void addUserInToList(User* db, int age, char* name) {
db->userAge = age;
db->userName = name;
}
答案 0 :(得分:1)
更改功能addUserInToList()
,如下所示
void addUserInToList(User* db, int age, char* name) {
db->userAge = age;
db->userName = malloc(strlen(name) + 1);
strcpy(db->username, name);
}
您尝试做的只是将所有用户的数据库username
指向由char name[5] ;
指向的单个内存位置,因此所有用户名都相同。
现在,您可以为每个用户名分配内存,并在新用户必须添加到数据库时进行复制。
答案 1 :(得分:1)
这是因为结构的userName
成员只是一个指针。即内存中某处的另一个变量的地址。
当您在name
例程中读取用户对main
变量的输入时,您将过度写入该数组中的任何内容。调用addUserInToList
会将所选结构中的userName
指针更改为name
变量的地址。由于只有一个name
变量可以重复用于每个输入,list
变量中的每个元素都将包含userName
指针的相同值,因此它们都指向相同的值名称,这将是最后输入的名称。
您应该将结构的userName
成员更改为数组并复制addUserInToList
函数中的内容。
#define USER_NAME_SIZE 5
typedef struct User {
char userName[USER_NAME_SIZE];
int userAge;
}User;
void addUserInToList(User* db, int age, char* name) {
db->userAge = age;
//Copy the name into the struct, but leave space for one NUL at teh end.
strncpy(db->userName, name, (sizeof db-userName) - 1);
}
更高级的&#39;方法是使用malloc
(和free
)创建一个新数组来保存名称。您可以将此视为练习。