繁体   English   中英

malloc需要sizeof运算符吗?

[英]Is the sizeof operator needed for malloc?

在这个程序(C,而不是C ++)中 ,为什么无论使用sizeof运算符,malloc总是返回正确的大小?

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    char *c = malloc(3);
    short *s = malloc(3); /* or malloc(3 * sizeof(short))? */
    int *i = malloc(3);   /* or malloc(3 * sizeof(int))? */
    long *l = malloc(3);  /* or malloc(3 * sizeof(long))? */

    printf("%p\n", c++);
    printf("%p\n", c++);
    printf("%p\n", c++);

    printf("---\n");

    printf("%p\n", s++);
    printf("%p\n", s++);
    printf("%p\n", s++);

    printf("---\n");

    printf("%p\n", i++);
    printf("%p\n", i++);
    printf("%p\n", i++);

    printf("---\n");

    printf("%p\n", l++);
    printf("%p\n", l++);
    printf("%p\n", l++);

    return 0;
}

输出是:

0x1e82010 (1 byte)
0x1e82011
0x1e82012
---
0x1e82030 (2 bytes)
0x1e82032
0x1e82034
---
0x1e82050 (4 bytes)
0x1e82054
0x1e82058
---
0x1e82070 (8 bytes)
0x1e82078
0x1e82080

我错过了什么吗?

4.0.4-303.fc22.x86_64 clang版本3.5.0(标签/ RELEASE_350 / final)目标:x86_64-redhat-linux-gnu线程模型:posix

long *l = malloc(3);

这分配(或者更确切地说是尝试分配)3 个字节

通常, malloc()实际上会分配比您请求更多的内容,用于对齐和簿记。 因此,在调用malloc(3) ,您可能能够在分配的内存中存储3个long值。 但它不能保证。

是的,你确实需要sizeof

写这个的最好方法是:

long *l = malloc(3 * sizeof *l);

通过使用指针所指向的大小( sizeof *l ),您不必long两次指定类型,如果类型稍后更改,代码将不会中断。

更好的是:

long *l = malloc(3 * sizeof *l);
if (l == NULL) {
    /* malloc failed, recover or bail out */
}

如果您愿意,可以将其写成:

long *l = malloc(3 * sizeof(*l));

但额外的括号不是必需的,size sizeof是一元运算符,而不是函数。

printf("%p\n", l++);
printf("%p\n", l++);
printf("%p\n", l++);

递增指针会使其指向的类型大小。 long显然是你系统上的8个字节,所以这将使l至少增加24个字节,远远超过你从malloc请求的3个字节。 结果是未定义的行为。

通过递增l ,你已经丢失了malloc返回的原始值; 是时候打电话给free()

最后, %p格式说明符需要类型为void*的参数。 传递不同的指针类型很可能“工作”,但你真的应该将它转换为void*

printf("%p\n", (void*)l++);

我错过了什么吗?

是的,你完全忽略了这一点。

您正在测试指针算术 ,它是根据指向类型的大小定义的。 这与malloc()分配的malloc()量完全无关,甚至与所讨论的指针完全指向有效地址无关。

递增指针会使存储的地址增加基本类型的大小。 它不依赖于指针指向的内容。

递增指针时递增的字节数仅基于其类型 - 例如,如果将int*递增1,则将地址递增4个字节。 这与mallocsizeof或任何东西无关。

您会发现,如果您开始在这些指针中存储值,您将遇到奇怪的行为,因为您没有分配足够的空间来存储3个short s,3个int或3个long

你已成为谬误的牺牲品。 您没有分析malloc返回的内容,您看到增量知道如何根据变量类型的大小正确递增指针。 没有关于malloc调用的信息告诉你实际分配了多少RAM。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM