将 pid_t 转换为字符串
Converting pid_t to string
我正在尝试将 pid 转换为字符串。
我这样试过:
int pid = getpid(); //this int conversion should be ok as far as I know
char * mypid = (char *)malloc(sizeof(int));
sprintf(mypid, "%d", pid);
我假设我的错误可能是我最后没有添加NULL。我试图这样做,但仍然收到错误消息。有人可以向我解释什么是将 PID 转换为 char * ("string") 的最佳方法吗?谢谢!!
sizeof(int)
在您的系统上很可能是 4 个字节。包含 PID 的字符串将需要(假设 16 位 PID)至少 6 个字节:5 个用于十进制数字,1 个用于空终止符。因此,您没有分配足够的 space 并且可能写入已分配数组的末尾。这会调用 undefined behavior.
确保为有问题的字符串分配足够的 space:
int pid = getpid();
char * mypid = malloc(6); // ex. 34567
sprintf(mypid, "%d", pid);
或者使用固定大小的字符串:
int pid = getpid();
char mypid[6]; // ex. 34567
sprintf(mypid, "%d", pid);
如果您的系统支持 32 位 PID,则至少需要 11 个字节。对于 64 位 PID,至少 21.
mypid 字符数组的大小不正确。您正在使用 sizeof(int)
这是在您的系统上保存整数所需的字节数,而不是整数的字符串长度。如果您想要精确,您可以计算位数,或者如果不关心精确存储,则可以分配足够大小的缓冲区。
正确且安全的是:
const size_t max_pid_len = 12; // Could be system dependent.
int pid = getpid();
char * mypid = malloc(max_pid_len + 1);
snprintf(mypid, max_pid_len, "%d", pid);
sprintf
将格式化字符串并为您添加一个终止零,只要有足够的缓冲区 space 即可。
你的实际问题是这样的:sizeof(int)
不足以容纳任何可能的整数的字符串值;这只是您系统上 int
的字节长度。如果 int
在您的系统上是 32 位,您需要分配至少 12 个字节来容纳最长的可能的 base-10 字符串表示(-2147483648
加上终止零)。如果一个int
是64位,则需要分配21个字节。
to convert a pid into a string
malloc(sizeof(int)
是一个int
的大小,比如4个字节。不是以字符串形式保存为十进制文本的内存量。
getpid()
returns 输入 pid_t
.
鉴于 pid_t
是根据 IEEE (it is buried deep) and here 签名的,但宽度未知,可以合理地假设它不宽于 intmax_t
。
将 pid_t
分配给 int
可能会导致信息丢失。
最小分配
让asprintf()
分配并转换为字符串。 ref
pid_t pid = getpid();
char *mypid = NULL;
if (asprintf(&mypid, "%jd", (intmax_t) pid) != -1) {
// Success
// use mypid somehow.
free(mypid); // cleanup when done.
}
我正在尝试将 pid 转换为字符串。 我这样试过:
int pid = getpid(); //this int conversion should be ok as far as I know
char * mypid = (char *)malloc(sizeof(int));
sprintf(mypid, "%d", pid);
我假设我的错误可能是我最后没有添加NULL。我试图这样做,但仍然收到错误消息。有人可以向我解释什么是将 PID 转换为 char * ("string") 的最佳方法吗?谢谢!!
sizeof(int)
在您的系统上很可能是 4 个字节。包含 PID 的字符串将需要(假设 16 位 PID)至少 6 个字节:5 个用于十进制数字,1 个用于空终止符。因此,您没有分配足够的 space 并且可能写入已分配数组的末尾。这会调用 undefined behavior.
确保为有问题的字符串分配足够的 space:
int pid = getpid();
char * mypid = malloc(6); // ex. 34567
sprintf(mypid, "%d", pid);
或者使用固定大小的字符串:
int pid = getpid();
char mypid[6]; // ex. 34567
sprintf(mypid, "%d", pid);
如果您的系统支持 32 位 PID,则至少需要 11 个字节。对于 64 位 PID,至少 21.
mypid 字符数组的大小不正确。您正在使用 sizeof(int)
这是在您的系统上保存整数所需的字节数,而不是整数的字符串长度。如果您想要精确,您可以计算位数,或者如果不关心精确存储,则可以分配足够大小的缓冲区。
正确且安全的是:
const size_t max_pid_len = 12; // Could be system dependent.
int pid = getpid();
char * mypid = malloc(max_pid_len + 1);
snprintf(mypid, max_pid_len, "%d", pid);
sprintf
将格式化字符串并为您添加一个终止零,只要有足够的缓冲区 space 即可。
你的实际问题是这样的:sizeof(int)
不足以容纳任何可能的整数的字符串值;这只是您系统上 int
的字节长度。如果 int
在您的系统上是 32 位,您需要分配至少 12 个字节来容纳最长的可能的 base-10 字符串表示(-2147483648
加上终止零)。如果一个int
是64位,则需要分配21个字节。
to convert a pid into a string
malloc(sizeof(int)
是一个int
的大小,比如4个字节。不是以字符串形式保存为十进制文本的内存量。
getpid()
returns 输入 pid_t
.
鉴于 pid_t
是根据 IEEE (it is buried deep) and here 签名的,但宽度未知,可以合理地假设它不宽于 intmax_t
。
将 pid_t
分配给 int
可能会导致信息丢失。
最小分配
让asprintf()
分配并转换为字符串。 ref
pid_t pid = getpid();
char *mypid = NULL;
if (asprintf(&mypid, "%jd", (intmax_t) pid) != -1) {
// Success
// use mypid somehow.
free(mypid); // cleanup when done.
}