0

我的目标是读取文件并将其内容存储在 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

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

非常感谢

沙恨沙

4

4 回答 4

4

这与malloc.

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

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

于 2013-09-26T19:31:21.953 回答
0

sizeof char *ptr will give the sizeof the pointer address ptr pointing . Its vary depends on the machine.

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

Examine below code:

#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;
}
于 2013-09-26T19:42:34.563 回答
0

显然你对sizeof. 显然你假设sizeof可以用来查询malloc-ed 内存块的大小。

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

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

于 2013-09-26T19:55:27.137 回答
0

就这两行代码

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

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

Size allocated to data: 8

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

malloc无关sizeof(data)

于 2013-09-26T19:51:46.947 回答