int main()
{
int n = 56;
char buf[10]; //want char* buf instead
sprintf(buf, "%i", n);
printf("%s\n", buf);
return 0;
}
这段代码有效,我的问题是如果我想要相同的行为,buf是char *?
答案 0 :(得分:3)
写作时的主要区别
char* buf;
是它未初始化且没有分配内存,所以你必须自己照顾:
char* buf = malloc(10 * sizeof(char));
// ... more code here
free(buf); // don't forget this or you'll get a memory leak
这称为dynamic memory allocation(与静态分配相对),它允许您使用realloc
或使用malloc
调用中的变量等changing the amount of allocated memory at runtime等优秀内容。
另请注意,如果内存量太大,内存分配可能会失败,在这种情况下返回的指针将为NULL
。
从技术上讲,上面不需要sizeof(char)
,因为1 char
的大小总是1个字节,但大多数其他数据类型更大,乘法很重要 - malloc(100)
分配100 bytes 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。
答案 1 :(得分:1)
我认为calloc(或malloc,如果你没有calloc)是你所追求的。
答案 2 :(得分:1)
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;
}
编辑:正如“托马斯·帕德龙 - 麦卡锡”在评论中所指出的那样,你不应该归还malloc()
。您会找到更多信息here。您也可以完全删除sizeof(char)
1
,因为{{1}}。