[英]Store an int in a char* [C]
int main()
{
int n = 56;
char buf[10]; //want char* buf instead
sprintf(buf, "%i", n);
printf("%s\n", buf);
return 0;
}
這段代碼有效,我的問題是,如果我想要相同的行為,而buf是char *,該怎么辦?
寫作時的主要區別
char* buf;
它是未初始化的,並且沒有分配內存,因此您必須保重:
char* buf = malloc(10 * sizeof(char));
// ... more code here
free(buf); // don't forget this or you'll get a memory leak
這稱為動態內存分配 (相對於靜態分配),它允許您進行一些不錯的操作,例如在運行時使用realloc
或在malloc
調用中使用變量來更改分配的內存量 。 還要注意,如果內存量太大,內存分配可能會失敗,在這種情況下,返回的指針將為NULL
。
從技術上講,不需要上面的sizeof(char)
,因為1個char
始終為1個字節,但是大多數其他數據類型更大,並且乘法很重要malloc(100)
分配100個字節, malloc(100 * sizeof(int))
分配100 int
所需的內存量,在32位系統上通常為400字節,但是會有所不同。
int amount = calculate_my_memory_needs_function();
int* buf = malloc(amount * sizeof(int));
if (buf == NULL) {
// oops!
}
// ...
if (more_memory_needed_suddenly) {
amount *= 2; // we just double it
buf = realloc(buf, amount * sizeof(int));
if (!buf) { // Another way to check for NULL
// oops again!
}
}
// ...
free(buf);
另一個有用的函數是calloc
,它具有兩個參數(第一個:要分配的元素數,第二個:元素的大小(以字節為單位))並將內存初始化為0。
我認為calloc(如果沒有calloc,則為malloc)是您所追求的。
buf
是在堆棧上靜態分配的數組。 為了使其成為char *
類型,您需要動態分配內存。 我想你想要的是這樣的:
int main()
{
int n = 56;
char * buf = NULL;
buf = malloc(10 * sizeof(char));
sprintf(buf, "%i", n);
printf("%s\n", buf);
// don't forget to free the allocated memory
free(buf);
return 0;
}
編輯:正如“ Thomas Padron-McCarthy”在評論中指出的那樣,您不應該轉換malloc()
的返回值。 您可以在此處找到更多信息。 您也可以將sizeof(char)
完全刪除,因為它將始終為1
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.