【问题标题】:How does the malloc function work in C?malloc 函数在 C 中如何工作?
【发布时间】:2013-09-26 19:29:40
【问题描述】:

我的目标是读取一个文件并将其内容存储在一个 char 数组中,给定偏移量和要读取的字节数。我已经写了一个函数来做同样的事情,它工作正常。

现在这个函数将从其他地方调用。所以我试图声明一个变量char * data,它将保存上述函数返回的内容。声明后我尝试为其分配一些内存。 (我知道多少,因为我指定了要读取的字节数)。如下:

char * data;
char * filename = "alphabet.txt";
int data_size = 10;
printf("data size: %d\n", data_size);
data = (char*) malloc (data_size);
printf("Size allocated to data: %d\n",sizeof(data));
return 0;

此代码给出以下输出:

data size: 10
Size allocated to data: 8

我不明白这种行为。谁能给我解释一下。

非常感谢

沙恨沙

【问题讨论】:

  • "malloc 函数在 C 中是如何工作的?" - 不,而是“sizeof 运算符在 C 中是如何工作的?”
  • c 中,您不应该将 malloc 的返回值转换为 (char *)。您可以毫无问题地将 void 指针分配给它。
  • @GavinH:这实际上是一件坏事,不仅仅是没有必要。
  • @EdS。同意 - 更新措辞

标签: c malloc sizeof


【解决方案1】:

这与malloc无关。

sizeof 在编译时做它的事情,而不是运行时。 sizeof(data)sizeof(char*) 相同。您的程序在编译时无法知道该指针引用了多少内存。

另一方面,sizeof(some_array) 会按照您的预期工作,因为数组大小在编译时是已知的。

【讨论】:

  • 啊!我明白了,我在这里做什么。感谢您的快速回复。所以,我正确地使用了 malloc,对吧?那么我应该简单地调用 read_file 函数..对吗?
  • @Shahensha "我正确地使用了 malloc,对吧?" - 不完全 - see this.
  • @Shahensha 另外,printf("%d", sizeof(stuff)); 是未定义的行为——sizeof 运算符生成一个 size_t 类型的对象,该对象将使用 %zu 转换说明符打印。
【解决方案2】:

sizeofchar *ptr 将给出指针地址ptr 指向的大小。它因机器而异。

char *ptr = malloc(10); malloc will allocate the 10 space and ptr pointing
         to the starting address.

检查以下代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char * data;
int data_size = 10;
printf("data size: %d\n", data_size);
data = malloc ((data_size+1)*sizeof(char));
strcpy(data, "datadatada");
printf("string lenght: %d\n",strlen(data));
printf("Size allocated to data: %zd\n",sizeof(data));
return 0;
}

【讨论】:

  • 您有一个非一的错误(没有空间用于终止 NUL 字节)并且您错误地转换了 malloc() 的返回值。您还使用%d 打印size_t,这是未定义的行为。
【解决方案3】:

就这两行代码

char * data;
printf("Size allocated to data: %d\n",sizeof(data));

将打印(在 OP 的机器上):

Size allocated to data: 8

sizeof 返回参数的大小,这里是data 指针。它在编译时完成。

mallocsizeof(data)无关。

【讨论】:

    【解决方案4】:

    显然你对sizeof 的行为做了一些完全没有根据的假设。显然您假设sizeof 可用于查询malloc-ed 内存块的大小。

    不可能。 sizeof 与此完全无关。事实上,C 库并没有为您提供任何方法来确定malloc-ed 内存块的大小。这简直是​​不可能的。如果您想知道您分配了多少内存,您必须设计自己的方式来记住您从malloc 请求了多少内存。一个故事的结尾。

    sizeof 计算其操作数的大小。在这种情况下,您提供了一个指针作为其操作数,因此它计算为指针的大小,在您的平台上恰好是 8

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-18
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 2022-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多