Я прочитал страницу руководства по getpwuid и там написано:
Возвращаемое значение может указывать на статическую область и может быть перезаписано
последующими вызовами getpwent(3), getpwnam() или getpwuid(). (Не передавайте
возвращенный указатель на free(3).)
Я читал, что статическая область в структуре памяти процесса содержит текст, инициализированные данные и неинициализированные данные. Но возвращаемый адрес не находится ни в одном из этих регионов (насколько я понимаю - глядя на границу этих регионов из etext, edata и end).
У меня следующие вопросы:
- Я не могу понять, кто выделяет память для строки имени пользователя (и шести другие поля в структуре passwd). Кто несет ответственность за ее освобождение?
- Как компилятор может знать, какой длины будут имя пользователя, пароль и другие поля, чтобы он мог распределять память статически?
#include
#include
#include
#include
#include
extern char etext, edata, end;
char* userNameFromId(uid_t uid)
{
struct passwd *pwd;
pwd = getpwuid(uid);
return (pwd==NULL)?NULL:pwd->pw_name;
}
int main(int argc, char** argv)
{
uid_t u;
char* endptr = NULL;
char* name;
if(argc!=2){
printf("Usage: %s [user_id]\n", argv[0]);
return -1;
}
u = strtol(argv[1], &endptr, 10);
if(*endptr!='\0') {
printf("%s is not a number\nUsage: %s [user_id]\n", argv[1], argv[0]);
return -1;
}
name = userNameFromId(u);
if(name == NULL) {
printf("No user was found with the given id: %s\n", argv[1]);
return -1;
}
printf("program text ends before %10p\n", &etext);
printf("initialized data ends before %10p\n", &edata);
printf("uninitializd data ends before %10p\n", &end);
printf("name is located at %10p\n", &name);
printf("program break is located at %10p\n", sbrk(0));
printf("User name for id %d is %s\n", u, name);
return 0;
}
После выполнения этой программы выводится примерно следующее:
ragav@DESKTOP-JJOG9GH:~$ ./a.out 1000
program text ends before 0x559fbcea23d5
initialized data ends before 0x559fbcea5010
uninitializd data ends before 0x559fbcea5018
name is located at 0x7ffc87a9f7f0
program break is located at 0x559fbd81b000
User name for id 1000 is ragav
Подробнее здесь: https://stackoverflow.com/questions/791 ... emory-from
Мобильная версия