我想调用25字节的内存。在这种情况下,msg_len=5个字节,因为这就是输入
int full_msg_size = 20 + msg_len;
printf("full_msg_size: %dn", full_msg_size);
void *full_msg = calloc(full_msg_size, sizeof(char));
printf("size of full_msg: %dn", (int*)sizeof(full_msg));
这就是打印出来的:
full_msg_size:25full_msg:8 的大小
但我希望full_msg的大小等于25个字节,就像full_msg_size一样。
我还希望所有的内存空间初始化为零。
有人能告诉我如何正确地调用/malloc吗?
感谢
你很可能分配了正确的字节数,但你问的是指向void的指针有多大。在64位的盒子上,它很可能是8个字节。如果它未能分配您要求的内存量,那么full_message的值将为NULL。
sizeof
运算符(几乎总是)是编译时运算符(异常:VLA)。因此,sizeof
-some指针总是相同的(在您的机器上,它总是8),并且不取决于传递给某个malloc
或calloc
函数的大小。
给定一个malloc
-ed或calloc
-ed指针,没有可移植的方法来知道在其分配时请求的大小。你应该把那个尺寸留个地方!如果您想在分配的结构中保持动态大小,可以使用灵活的数组成员,如这里所示。您经常将大小保留在其他地方,即某个变量中(在您的情况下为full_msg_size
)。
所以您的calloc
正在工作(顺便说一句,您应该针对失败进行测试)。
void *full_msg = calloc(full_msg_size, 1);
if (!full_msg) {perror("calloc"); exit(EXIT_FAILURE); };
但是不能使用sizeof
来计算分配区域的运行时大小。
在您的文章中,您似乎真的想确定变量包含的字符串的长度,而不是变量的大小。sizeof
应用于指针时,会告诉您地址的大小,而不是字符串的长度。如果需要在运行时确定字符串的长度,请使用函数strlen
:
`int len = strlen(some_str)`
您可能会得到full_msg_size:25大小的full_msg:8,因为sizeof
正在返回CCD_ 12的地址的大小。
所以,你的功能:
printf("size of full_msg: %dn", (int*)sizeof(full_msg));
应为:
printf("length of full_msg: %dn", strlen(full_msg));
如果您想要想要调用25字节的内存:
char *full_msg = {0};
full_msg = calloc(25, 1); //all space initialized to 0
//or you can also use:
full_msg = malloc(25);
full_msg现在正好有25个字节的内存,(但其中一个需要用于"\0")
在char *str
上使用sizeof
运算符时,会返回char *
的大小,这只是一个地址。
注意:地址(或指针)的大小不会总是8字节,因为您运行的是64位机器,这取决于应用程序编译为32位或64位。即,对于32但应用程序,地址的大小为4字节,对于64位应用程序,将为8字节。
您正在打印指针的大小,在64位机器的情况下,指针的大小为8字节。