-1
int main(void){
    char *p[]={};
    char *temp=NULL;
    int end=0;
    char y_n=0;
    int w=0; //pointer array subscript 
    int gc=1;

while(true){
    printf("enter content:\n");
    while((end=getchar())!='\n'){
        if(gc==1){
            p[w]=(char *)calloc(gc,sizeof(char));
            strcat(p[w],(char *)&end);
        }
        else{
            temp=(char *)realloc(p[w],gc*sizeof(char));
            if(temp==NULL){
                printf("memory fail\n");
                break;
            }
            p[w]=temp;
            /*here temp and p[w] reference same address
            so temp pointer set value is NULL break reference address
            so temp pointer not use free function.
            if temp pointer use free function,at the same time clean p[w] in memory address.
            */
            temp=NULL;
            strcat(p[w],(char *)&end);
        }
        gc++;
    }
    printf("p[%d]:%s\n", w,p[w]);
    gc=1;
    w++;

    printf("continue y or n:");
    scanf("%c",&y_n);
    if(y_n=='n'){
        break;
    }
    getchar();
}
printf("w:%d\n", w);


    /*test*/
    while((--w)>=0){
        printf("p[%d]:%s\n", w,p[w]);
        free(p[w]);
        p[w]=NULL;
   }
    return 0;
}

-------------------------------

初期値 w=0, p[w=0] エラーへのサイクル: セグメンテーション違反 (コアダンプ)


初期値 w=1 start

サイクル p ポインター配列は問題ありません

なぜ?初期値ポインタ配列がありません。添字は 0 から開始できませんか?</p>

4

1 に答える 1

4
char *p[]={};

は有効な C ではありませんが、GNU 拡張 (clang でも受け入れられます) であるため、gcc はコードを受け入れます。

ただし、これが行うことは、サイズが 0pchar*s の配列を宣言することです。したがって、 any を使用すると、p[w]未定義の動作が呼び出されます。落ちるかどうかは運次第です。運が良ければ、常にクラッシュします。

p必要なサイズで宣言する必要があります。必要な要素の数がわからない場合は、char**and malloc/ reallocit にします。

于 2013-06-23T10:43:40.027 に答える