-1

c 関数 'strcpy' に問題があり、それを理解できませんでした。

これには、Argv のような char *[] へのコピーが含まれます (ただし、実際には Argv ではありません)。構造体からコピーすることはできますが、中にコピーすることはできません。ただし、Argv 構造体全体を最初に 1 回で宣言した場合に限ります。

char *[]aは であり、 の配列であると仮定しchar*ます。

この問題の簡単なデモ プログラムを次に示します。

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

char FN[]="BBBB";   

char *TL[]={
 "a0                ",
 "a1                ",
 "a2                ",
 "a3                ",
 "a4                ",
 "a5                "};

 char BN[]="c1                    ";

 char N0[]="N0                    ";
 char N1[]="N1                    ";
 char N2[]="N2                    ";
 char N3[]="N3                    ";
 char N4[]="N4                    ";
 char N5[]="N5                    ";

 char* TD[6]; 


 int main ( int argc, char *argv[] )
 {

    // FN is a pointer to an array of chars
    // BN is the same

    //TL is an array of pointers (that each point to an array of chars)

    //TL[1] is thus a pointer to an array of chars

    //TL is the same structure as Argv

    //TD is the same structure as Argv  (but built up from parts)
    //  but is spread out across the globals and the main func.
    //  thus less easy to read and understand then TL.

    //TL[i], TD[i], and BN are initially allocated significantly larger than FN
    //  to remove the worry of overruns.

    //copy "a1                \0" into the space held by "c1   "
    strcpy(BN,TL[1]); //works

    //copy "BBBB\0" into the space held by "c1   "
    strcpy(BN,FN); //works

    TD[0]=N0;
    TD[1]=N1;
    TD[2]=N2;
    TD[3]=N3;
    TD[4]=N4;
    TD[5]=N5;

    //copy "BBBB\0" into the space held by "a1   "
    strcpy(TD[1],FN); //works

    //copy "BBBB\0" into the space held by "a1   "
    //strcpy(TL[1],FN); //dies



}
4

2 に答える 2

4

ポインタcharは文字列リテラルを指しています。それらは書き込み可能ではありません。それらの型はchar*歴史的な理由によるものですが、常に として扱う必要がありますchar const *

mallocバッファ用のスペースを確保するかchar、配列の配列を使用してください。

于 2013-09-07T14:49:16.380 に答える
1

上記のコメントでdasblinkenlightによって投稿されたリンクとして、

char * p = "xyz"; is different from 

char p[] = "xyz"; 

1 つ目は不変、2 つ目は変更可能です。

「char *s」ではなく「char s[]」で初期化された文字列に書き込むと、セグメンテーション違反が発生するのはなぜですか?

于 2013-09-07T16:02:26.433 に答える