0

このコードは完全に機能していることがわかりました。

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




int main(int argc,char *argv[])
{
    char* s;        /* input string */
    s=malloc(sizeof(s));    

    int c;

    if(argc==1){ // if file name not given


        while (gets(s)){
            puts(s);
        }
    }
}

私が理解していないのは、文字列 s がメモリにどのように格納されているかということです。4 バイトのポインタ s にのみメモリを割り当てています。ユーザーが指定した入力文字列はどこに格納されますか?

4

4 に答える 4

0

最初の 4 バイトに対してのみ安全です。5 番目のバイトは、割り当てられたデータをオーバーランし、未定義の動作を引き起こす何か他のものを踏みにじります (クラッシュする可能性がありますが、クラッシュしない可能性があります)。

また、文字の書き込みが終了した後、文字列を '\0' で null で終了しないため、文字列ルーチン (strcpy) を呼び出しようとすると、別のクラッシュが発生する可能性があります。とにかくたまたまゼロが含まれていましたが、当然、このチャンスに頼るべきではありません!

于 2013-10-09T04:57:50.630 に答える
0

コンパイラが 2 バイトを割り当てるため、可能です。入力に10バイトを指定すると、割り当てられたメモリがオーバーフローし、割り当てられたメモリを超えてデータが保存されるようになりました。

保存するデータが使用可能なデータよりも大きい場合はエラーが発生し、保存するデータが割り当てられたデータよりも大きい場合はエラーになりません。

puts は、'\0' になるまでデータを出力します。

したがって、これは予想される動作です!!

于 2013-10-09T04:58:07.817 に答える
0

これよりも、あなたがすべきこと

s=malloc(sizeof(*s)*(number_of_chars+1)); 

number_of_charsこれらの多くの文字を格納するためにメモリを割り当てるように、適切な値に設定します。+1は最後の'\0'文字です。

あなたのアプローチでは4 bytes、通常、それらの多くの文字を保存できるように割り当てています。

于 2013-10-09T04:53:22.960 に答える
0

sizeof(void*)メモリのバイトを割り当て、ユーザー提供のデータで埋めました。あなたはアドレスを持っていて、それに書き込んでいます。コンパイラの観点からは問題ありません(おそらく、それは本当にあなたが望んでいることです)。それを超えたときにプログラムがクラッシュしなかったとしても、それは依然としてエラーです。それはただの記憶であり、この領域には何か他のものが保存されている可能性があり、それを上書きすることになります。

于 2013-10-09T04:55:35.017 に答える