在malloc内存上使用sizeof()

时间:2010-02-14 02:10:02

标签: c malloc sizeof

  

可能重复:
  newbie questions about malloc and sizeof

我正在尝试将字符串读入程序。当我注意到字符串有时被破坏时,我尝试了以下代码:

 void *mallocated = malloc(100);
 printf("sizeof(mallocated) = %d\n", sizeof(mallocated));

根据我的程序,mallocated的大小为8,即使我为它分配了100个字节。因此,每当我尝试存储长度超过8个字节的字符串时,第8个字节后的所有内容有时会消失。为什么会发生这种情况,我该如何预防呢?

5 个答案:

答案 0 :(得分:17)

因为“string”指针的大小是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

Source

你要忽略你如何确定你的字符串正在消失(字符数组)。它可能被传递给一个函数,您需要将显式长度作为变量传递或在某处跟踪它。使用sizeof()不会告诉你这个。

请参阅我的previous question有关此问题,您甚至会看到我缺乏初步了解。

答案 1 :(得分:9)

在C89中,sizeof运算符仅在编译时以字节为单位查找变量的大小(在本例中为8个字节的void指针)。它的工作方式与普通数组相同,因为它们的大小在编译时是已知的。

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对您没有帮助。

答案 2 :(得分:8)

sizeof返回您给它的指针(void *)的大小,而不是您分配的内存大小。如果要稍后使用,则必须将内存大小存储在单独的变量中。

答案 3 :(得分:4)

你做不到。正如所指出的那样,你可以得到void * mallocated的大小,但这并没有告诉你多少。

无法获得被列为*mallocated的大小。也就是说,除非你编写自己的内存管理例程,否则没有函数调用返回100(在你的例子中)。

最简单的只是在某处记住它......也许......

stuct {
  void *data;
  unsigned int size
 } myStructureWhichRemebersItsSize;

myStructureWhichRemebersItsSize *someData;
someData.data = malloc(100);  // and check for NULL
someData.size = 100;

答案 4 :(得分:-1)

void*是内存中某个位置的类型,如果您不知道它包含的内容。应该避免。

char*是一个值的类型,它指向内存中保存char的某个位置。识别内存中的位置需要8个字节。

sizeof告诉您特定类型需要多少字节。不是用malloc分配了多少,而是分配了多少内存编译器知道应该的类型。将sizeof应用于值通常被认为是错误的样式,并且像这里提到的其他人一样,有时会在C99中调用智能行为。

char[100]包含100个字符的值的类型。 char[100] a;是一个包含100 char个字符串的字符串。

char(*)[100]是指向包含100个字符的值的指针类型。 char(*b)[100];使b指向100个字符,可能在堆上。您可能想要的是

char (*s)[100] = malloc( sizeof( char[100] ) );
printf( "%u byte pointer to %u bytes of size %u elements\n",
  sizeof s, sizeof *s, sizeof **s );