malloc函数如何在C中工作?

时间:2013-09-26 19:29:41

标签: c malloc sizeof

我的目标是在给定偏移量和要读取的字节数的情况下读取文件并将其内容存储在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

我不明白这种行为。有人可以向我解释一下。

非常感谢

shahensha

4 个答案:

答案 0 :(得分:3)

这与malloc无关。

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

另一方面,sizeof(some_array)可以正常工作,因为数组大小在编译时是已知的。

答案 1 :(得分:0)

sizeof char *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;
}

答案 2 :(得分:0)

这两行代码

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

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

Size allocated to data: 8

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

mallocsizeof(data)无关。

答案 3 :(得分:0)

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

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

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