首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在malloc内存上使用sizeof()

在malloc内存上使用sizeof()
EN

Stack Overflow用户
提问于 2010-02-14 02:10:01
回答 5查看 39.9K关注 0票数 15

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

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

代码语言:javascript
复制
 void *mallocated = malloc(100);
 printf("sizeof(mallocated) = %d\n", sizeof(mallocated));

根据我的程序,mallocated的大小是8,尽管我为它分配了100个字节。因此,每当我尝试存储大于8字节的字符串时,第8字节之后的所有内容有时都会消失。为什么会发生这种事,我怎样才能防止它发生?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-02-14 02:12:23

因为“字符串”指针的大小是8个字节。下面是一些使用具有适当“大小”的sizeof()的示例。size_of()这个词有时是用来欺骗不习惯使用它的人的。在这种情况下,指针的大小为8字节。下面是一个典型的32位系统的表示形式.

代码语言:javascript
复制
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()不会告诉你这个。

看看我的前一个问题关于这一点,你会看到,甚至我缺乏最初的理解。

票数 20
EN

Stack Overflow用户

发布于 2010-02-14 02:13:24

在C89中,sizeof运算符在编译时只找到以字节为单位的变量的大小(在本例中为8字节的void指针)。它的工作方式与您期望的在普通数组上的工作方式一样,因为它们的大小在编译时是已知的。

代码语言:javascript
复制
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不会帮助您。

票数 15
EN

Stack Overflow用户

发布于 2010-02-14 02:14:44

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

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2259890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档