在malloc’d内存上使用sizeof()

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

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

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

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

因为“字符串”指针的大小是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()不会告诉你这个。

看到我之前关于此的问题 ,你甚至会看到我缺乏初步的理解。

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

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

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

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

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

 stuct { void *data; unsigned int size } myStructureWhichRemebersItsSize; myStructureWhichRemebersItsSize *someData; someData.data = malloc(100); // and check for NULL someData.size = 100; 

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

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

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

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

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 );