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