2

に を割り当てたいのですが、char*使用char*するstrcpyとランタイムメモリの問題がいくつか発生するので、 を使用して簡単な割り当てで修正し= operatorます。strcpyメモリの問題を回避するために使用する前に何を準備する必要があるかを説明できますか?

編集:

int Function(const char* K,char* FileIN,char* FileOut,int DC)
{   
    char *fic_in,*n_fic,*fic_out,*fic_dec;

    unsigned char k[17];

        fic_in = (char*)malloc(60*sizeof(char));

        strcpy((char*)k,K);

        //strcpy(fic_in,FileIN);  //I remove this one
        fic_in=FileIN;            //and replace it by this
      ...
4

4 に答える 4

4

簡単な答え:あなたはまったく使うべきstrcpyではなく、むしろ使うべきstrncpyです。後者の機能は末尾に依存せ\0、コピーの最大長を指定する必要があります。

さらに、ポインタの割り当てについては、必ずしも必要strncpyではありません。メモリをコピーしますか、それとも単にポインタを再割り当てしますか?再割り当ての場合、=オペレーターは完全に問題ありません。

于 2012-10-11T13:11:09.717 に答える
4
const char *a = "string literal";
const char *b;

a文字列リテラルを指すポインタです。b特定の場所を指していないポインターです (初期化されていません)。

b = a;

bが指すのと同じメモリをa指すようになりました。

char c[100];

c100 文字の配列になりました。そのメモリ領域は、これまでのところ他のすべてのものとは完全に分離されています。

strcpy(c, a);

の内容c(具体的には最初の 15 バイト) は、 が指すメモリと同じ値を保持するようになりましたa。したがって、同じ文字列データを含むメモリ領域が2 つあります。

ご覧のとおり、ポインターの割り当ては とほとんど共通点がありませんstrcpy。を に割り当てたい場合はchar*、 のchar*近くにいるべきではありませんstrcpy

C++ に関する本を読むことは不可欠ですが、基本的な要件strcpyは、宛先ポインターが、ソース ポインターが指す文字列に十分なスペースがあるメモリ領域を指していなければならないということです。おそらく、「実行時のメモリの問題」は、それを確認していなかったためでした。そのため、本を読む必要があります。

于 2012-10-11T13:12:25.637 に答える
2

char*文字列の文字へのポインタです。コピーを作成するには、まずメモリを割り当ててコピーを実行する必要があります。何かのようなもの

size_t l = strlen(src);
char *dst = malloc(l+1);
memmove(dst,src,l+1);

(そして、malloc が成功したかどうかなどのエラー チェックを行います)。

ただし、質問がタグ付けされていることを考慮して、クラスを使用してその間に読書をc++することをお勧めします。std::string物事が実際にどのように機能するかを理解するのに本当に役立ちます。

于 2012-10-11T13:12:01.243 に答える
1

'\0'受信バッファが、末尾の - 文字を含め、ソース文字列に十分収まる大きさであることを確認する必要があります。それは本当にそれです。

文字列をコピーできる単なるchar *ポインターとして表現できる場合、それは素晴らしいことですが、常に可能であるとは限りません。

于 2012-10-11T13:12:12.920 に答える