c-如何精确调用()25字节



我想调用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),并且不取决于传递给某个malloccalloc函数的大小。

给定一个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字节。

相关内容

  • 没有找到相关文章

最新更新