[英]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.