将pid_t转换为字符串

时间:2018-11-09 16:56:08

标签: c string pid

我正在尝试将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 *(“字符串”)的最佳方法是什么?谢谢!

4 个答案:

答案 0 :(得分:3)

sizeof(int)在您的系统上很可能是4个字节。包含PID的字符串至少需要6个字节(假定为16位PID):十进制数字为5,空终止符为1。因此,您没有分配足够的空间,并且可能无法写入分配的数组末尾。这将调用undefined behavior

确保为有问题的字符串分配足够的空间:

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。

答案 1 :(得分:3)

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);

答案 2 :(得分:3)

sprintf将格式化字符串并为您添加一个终止零,只要有足够的缓冲空间即可。

您的实际问题是:sizeof(int)不足以容纳任何可能的整数的字符串值;这只是系统上int字节的长度。如果int是系统上的32位,则需要分配至少12个字节,以适应最长的以10为基数的字符串表示形式(-2147483648加上结尾的零)。如果int是64位,则需要分配21个字节。

答案 3 :(得分:3)

  

将pid转换为字符串

malloc(sizeof(int)int的大小,例如4个字节。这不是在字符串中另存为十进制文本的内存量。


getpid()返回类型pid_t

鉴于pid_t是按IEEE(埋在很深的地方)和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.
}