2

Cのスキルをリフレッシュしています。私は char *s を使用し、malloc を使用してメモリを s に割り当てています。次に、scanf を使用して、s への入力を読み取ります。しかし、私の質問は、メモリ チャンクのサイズを指定していないということです。しかし、プログラムは機能します。入力文字列の任意の長さに対してメモリはどのように割り当てられますか? scanf は単にポインタをインクリメントし、その場所にデータを書き込んでいますか?

#include <stdio.h>
#include <stdlib.h>

int main() {
    char *s;
    s = (char *) malloc(sizeof(s));    //I did not specify how much like malloc(sizeof(s) * 128)
    if (s == NULL) {
        fprintf(stderr, "\nError allocating memory for string");
        exit(1);
    }
    scanf("%s", s);
    puts(s);
    free(s);
    return 0;
}

/*
    Input:
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    Output:
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
*/
4

6 に答える 6

4

char *s;を使用すると、32ビットボックスと64ビットボックスのどちらを使用しているかに応じて、4または8とsizeof(s)同じになります。sizeof(char *)

32ビットボックスを使用している場合は、3文字とnullの「文字列の終わり」文字を格納できます。さらに保管すると爆発する可能性があります。

于 2012-10-23T04:25:06.937 に答える
1

sizeof(s)is you case は文字ポインターのサイズを返します。これは、32 ビットまたは 64 ビットのプラットフォームで実行しているかどうかに応じて、4 または 8 バイトになります。

sizeof(*s)代わりに使用したい。ただし、C 標準sizeof(char)では (これがどうsizeof(*s)なるか) は 1 であると指定されているため、文字配列の場合は必要ありません。

于 2012-10-23T04:55:30.860 に答える
1

sizeof(s)sタイプのサイズをバイト単位で返しますchar*。通常、32 ビット マシンでは 4 バイト、64 ビット マシンでは 8 バイトです。したがって、実際には malloc に割り当てるバイト数を指定sし、そのメモリ領域を指します。

于 2012-10-23T04:22:09.457 に答える
1

サイズを指定しました: sizeof(s)。以来、sです。プラットフォームによっては、長さが 4 バイトまたは 8 バイトになる場合があります。char *sizeof(s) == sizeof(char *)

つまり、文字列を格納するために 4 (または 8) バイトを効果的に割り当てたことになります。コマンド ラインに 3 文字 (または 7 文字) を超える文字を入力すると、割り当てられた配列の末尾を超えて書き込みを開始することになり、未定義の動作がトリガーされます。プログラムが正常に動作しているように見えたり、プログラムが残りのメモリを ZALGO で埋め尽くしたり、プログラムが恐ろしくセグメンテーション違反を起こしたり、常に人気のある鼻の悪魔に遭遇したりする可能性があります。C 仕様では、何が起こるかを指定していません (したがって、「未定義の動作」という用語が使われています)。

プログラムがまったく「機能する」という事実は完全なまぐれであり、決して信頼すべきではありません。

于 2012-10-23T04:32:03.280 に答える
0

のサイズと等しいサイズのメモリのみを割り当てていますInteger。この変数にもっと長い文字列を書き込むと、既存のメモリ位置が上書きされるだけで、プログラムは予期しない動作を示します。

于 2012-10-23T04:25:01.413 に答える
0

それは単にallocate the spaceポインタsize of char *をインクリメントしてその場所にデータを書き込むだけではありませんか? あなたが思ったように。

それが機能する理由の答えは次のとおりです。割り当てられていないメモリ領域に書き込むためですが、その領域が他のプロセスによって予約されている場合、プログラムはクラッシュします。より大きなスペースを割り当ててください。

于 2012-10-23T04:22:45.323 に答える