15

可能重复:
关于 malloc 和 sizeof 的新手问题

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

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

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

4

5 回答 5

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

资源

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

请参阅我之前关于此的问题,您甚至会发现我缺乏初步的理解。

于 2010-02-14T02:12:23.940 回答
15

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

于 2010-02-14T02:13:24.760 回答
9

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

于 2010-02-14T02:14:44.277 回答
5

你不能。正如所指出的,您可以获得分配的大小void *,但这并不能告诉您太多。

无法获得 malloed 的大小*mallocated。也就是说,没有返回 100 的函数调用(在您的示例中)-除非您编写自己的内存管理例程。

最简单的就是在某个地方记住它......也许......

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

myStructureWhichRemebersItsSize *someData;
someData.data = malloc(100);  // and check for NULL
someData.size = 100;
于 2010-02-14T02:19:01.593 回答
-1

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

char*是指向内存中某个位置的值的类型,该位置包含char. 识别内存中的位置需要 8 个字节。

sizeof告诉您特定类型占用多少字节。不是分配malloc了多少内存,而是编译器知道该类型应该占用多少内存。应用于sizeof值通常被认为是不好的风格,正如这里提到的其他人,有时会调用 C99 中的智能行为。

char[100]包含 100 个字符的值的类型。是堆栈上char[100] a;100 s 的字符串。char

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

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 );
于 2010-02-14T02:39:28.640 回答