如何将calloc()完全取消25个字节

时间:2014-10-24 16:10:57

标签: c memory malloc byte calloc

我想完全调用25个字节的内存。在这种情况下,msg_len = 5个字节,因为这是输入。这是我的代码:

  int full_msg_size = 20 + msg_len;
  printf("full_msg_size: %d\n", full_msg_size);
  void *full_msg = calloc(full_msg_size, sizeof(char));
  printf("size of full_msg: %d\n", (int*)sizeof(full_msg));

打印出来的是:

full_msg_size:25 size_msg的大小:8

但我希望full_msg的大小等于25个字节,就像full_msg_size一样。

我还想将所有内存空间初始化为零。

有人能告诉我如何正确地调用calloc / malloc吗?

由于

4 个答案:

答案 0 :(得分:4)

您最有可能分配正确的字节数,但是您要问的是指向void的指针有多大。在64位的盒子上,它很可能是8个字节。如果它未能分配您要求的内存量,那么full_message的值将为NULL。

答案 1 :(得分:3)

sizeof运算符(几乎总是)编译时运算符(例外:VLA s)。因此sizeof某些指针始终相同(在您的机器上,它始终为8)并且不依赖于传递给某些malloccalloc函数的大小。

给定malloc - ed或calloc - ed指针,没有可移植的方法来知道在其分配时间请求的大小。你应该保持这个大小的某个地方!如果要将动态大小保留在分配的结构中,可以使用灵活数组成员,如here。您经常将大小保持在其他位置,即在某个变量中(在您的情况下为full_msg_size)。

所以你的calloc正在运作(顺便说一句,你应该针对失败进行测试)。

void *full_msg = calloc(full_msg_size, 1);
if (!full_msg) {perror("calloc"); exit(EXIT_FAILURE); };

无法使用 sizeof来计算已分配区域的运行时大小。

答案 2 :(得分:1)

在您的帖子的上下文中,您似乎确实想要确定变量包含的字符串的 长度 ,而不是 <变量的em> size sizeof应用于指针时,会告诉您地址的大小,而不是字符串的长度。如果您需要在运行时确定字符串的 长度 ,请使用函数strlen

`int len = strlen(some_str)`    

您可能会收到 full_msg_size:25尺寸的full_msg:8 因为sizeof
返回full_msg地址的大小。

所以,你的功能:

printf("size of full_msg: %d\n", (int*)sizeof(full_msg));  

应该是:

printf("length of full_msg: %d\n", 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个字节的内存,(但需要用于&#39; \ 0&#39;)

sizeof上使用char *str运算符时,会返回char *的大小,这只是一个地址。

注意 :地址(或指针)的大小并不总是8字节只是因为您正在运行64位计算机 ,这取决于应用程序编译的内容:32位或64位。即,对于32但是应用程序,地址的大小是4个字节,对于64位应用程序,它将是8个字节。

答案 3 :(得分:1)

您正在打印指针的大小,对于64位计算机,这将是8个字节。