可能重复:
有关malloc和sizeof的新手问题
我正在尝试将字符串读入程序.当我注意到字符串有时被破坏时,我尝试了以下代码:
 void *mallocated = malloc(100);
 printf("sizeof(mallocated) = %d\n", sizeof(mallocated));
根据我的程序,大小mallocated是8,即使我为它分配了100个字节.因此,每当我尝试存储长度超过8个字节的字符串时,第8个字节后的所有内容有时会消失.为什么会发生这种情况,我该如何预防呢?
小智 19
因为"字符串"指针的大小是8个字节.以下是使用sizeof()及其相应"大小"的一些示例.术语size_of()有时会欺骗不习惯使用它的人.在您的情况下,指针的大小是8字节..下面是典型的32位系统上的表示.
sizeof (char)   = 1
sizeof (double) = 8
sizeof (float)  = 4
sizeof (int)    = 4
sizeof (long)   = 4
sizeof (long long)  = 8
sizeof (short)  = 2
sizeof (void *) = 4
sizeof (clock_t)    = 4
sizeof (pid_t)  = 4
sizeof (size_t) = 4
sizeof (ssize_t)    = 4
sizeof (time_t) = 4
你要忽略你如何确定你的字符串正在消失(字符数组).它可能被传递给一个函数,您需要将显式长度作为变量传递或在某处跟踪它.使用sizeof()不会告诉你这个.
Ale*_*x B 10
在C89中,sizeof运算符仅在编译时以字节为单位查找变量的大小(在本例中void为8字节的指针).它的工作方式是你期望它在普通数组上工作,因为它们的大小在编译时是已知的.
char arr[100]; // sizeof arr == 100
char *p = arr; // sizeof p == 4 (or 8 on 64-bit architectures)
char *p = malloc(100); // sizeof p == 4 (or 8). Still!
要知道堆分配内存的大小,您需要手动跟踪它,sizeof对您没有帮助.
你不能。正如所指出的,您可以获得void *错误分配的大小,但这并不能告诉您太多。
您无法获得 malloed 的大小*mallocated。也就是说,没有函数调用返回 100(在您的示例中)-除非您编写自己的内存管理例程。
最简单的就是在某处记住它......也许......
stuct {
  void *data;
  unsigned int size
 } myStructureWhichRemebersItsSize;
myStructureWhichRemebersItsSize *someData;
someData.data = malloc(100);  // and check for NULL
someData.size = 100;