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

0

この2行のコードだけ

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

の動作について、完全に根拠のない仮定を行ったようですsizeof。どうやら、 -ed メモリ ブロックsizeofのサイズをクエリするために使用できると想定したようです。malloc

それはできません。sizeofとはまったく関係ありません。malloc実際、C ライブラリは-ed メモリ ブロックのサイズを決定する手段を提供しません。それは単に不可能です。割り当てたメモリ量を知りたい場合は、 から要求したメモリ量を記憶する独自の方法を考案する必要がありますmalloc。物語の終わり。

sizeofそのオペランドのサイズに評価されます。この場合、オペランドとしてポインターを指定したため、ポインターのサイズに評価され、たまたま8プラットフォーム上にあります。

于 2013-09-26T19:55:27.137 に答える