簡體   English   中英

將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 *(“字符串”)的最佳方法是什么? 謝謝!!

sizeof(int)最有可能在您的系統上為4個字節。 包含PID的字符串至少需要6個字節(假定為16位PID):十進制數字為5,空終止符為1。 因此,您沒有分配足夠的空間,並且可能無法寫入分配的數組末尾。 這會調用未定義的行為

確保為有問題的字符串分配足夠的空間:

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將格式化該字符串並為您添加一個終止零。

您的實際問題是: sizeof(int)不足以容納任何可能整數的字符串值; 那只是系統中int的長度(以字節為單位)。 如果系統上的int是32位,則需要分配至少12個字節,以適應最長的以10為基數的字符串表示形式( -2147483648加上終止的零)。 如果int是64位,則需要分配21個字節。

將pid轉換為字符串

malloc(sizeof(int)是一個的大小int如4個字節,它不是的內存來保存為一個字符串的十進制文本的量。


getpid()返回類型pid_t

給定pid_t是按照IEEE簽名的(它被埋在很深的地方), 此處寬度未知,但合理的是假定它不比intmax_t寬。

pid_t分配給int可能會導致信息丟失。

最小分配

asprintf()分配並轉換為字符串。 參考

pid_t pid = getpid();
char *mypid = NULL;
if (asprintf(&mypid, "%jd", (intmax_t) pid) != -1) {
  // Success

  // use mypid somehow.

  free(mypid); // cleanup when done.
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM