2013-09-26 66 views
0

我的目标是读取文件并将其内容存储在char数组中,并给定要读取的偏移量和字节数。我写了一个相同的功能,它工作正常。malloc函数如何在C中工作?

现在这个函数是从别的地方调用的。所以我试图声明一个变量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

+5

“malloc函数如何在C中工作?” - 不,“运营商的规模如何在C工作?” – 2013-09-26 19:31:27

+0

[只有返回的指针才能获取malloc的大小](http://stackoverflow.com/questions/12131925/getting-the-size-of-a-malloc-only-with-the-returned-指针) – 2013-09-26 19:32:04

+1

在'c'中,你不应该把malloc的返回值转换为'(char *)'。您可以毫无问题地将void指针指定给它。 –

回答

3

这有什么好做malloc

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

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

+0

啊!我明白了,我在这里做了什么。感谢您的快速回复。所以,我正确使用malloc,对吧?我应该简单地调用read_file函数,然后......好吗? – shahensha

+0

@Shahensha“我正确使用malloc,对吗?” - 不完全 - [看到这个](http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc/605858#605858)。 – 2013-09-26 19:38:56

+0

@Shahensha另外,'printf(“%d”,sizeof(stuff));'是未定义的行为 - 'sizeof'运算符产生一个'size_t'类型的对象,它将使用'%zu'转换来打印符。 – 2013-09-26 19:39:57

0

sizeofchar *ptr会给出sizeof指针地址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; 
} 
+1

你有一个错误的错误(终止'NUL'字节没有空间),并且你错误地指定了'malloc()'的返回值。你也使用'%d'来打印'size_t',这是未定义的行为。 – 2013-09-26 19:45:05

0

只是这两行代码

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

将打印(在OP的机器):

Size allocated to data: 8 

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

mallocsizeof(data)无关。

0

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

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

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