-1

私はこの配列を持っています:

char *tags[100];

私がこれを行う場合:

tags[0]="something";

動作します(少なくともエラーはありません)。ただし、forループ内のまったく同じコードはそうではありません。

int j=0;       
for(j; j<100; ++j)
{
    tags[j]="something";
}

「セグメンテーション違反」と表示されます。これは何ですか?

更新:コード全体:

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

void append(char* s, char c)
{
        int len = strlen(s);
        s[len] = c;
        s[len+1] = '\0';
}


int main()
{
   int istag;
   FILE *fopen(), *fp;
   int i;
   fp = fopen("oldal.html","r");
   i= getc(fp) ;
   char* szo;

   int index=0;
   char *tags[100]; 

int j=0;       
for(j; j<100; ++j)
{
    tags[j]="something";
}


   while (i!= EOF)
   {            

        i = getc(fp);
        char c=i;

        if(c=='<')
        {
            istag=1;
        }
        if(c=='>')
        {
            istag=0;
            index++;
            //printf("tag vege: %s %d",tags[index],index);


        }

        if(istag)
        {

            //append(tags[index],'a');
        }

        append(szo,c);


   }

   //printf("%s",szo);
   fclose(fp);

   return 0;
}
4

4 に答える 4

5

コードはappend()関数を呼び出してデータをに追加しますがszoszo初期化されることはなく、宣言されたスタックにたまたま存在する値が含まれています。

それがどこに書いているのか誰が知っていますか。これが問題の原因であることはほぼ間違いありません。

szo十分なサイズの文字バッファをポイントして初期化します。追加されるデータとターミネータさえも保持できるように十分に大きくすることを忘れないでください。

于 2012-10-15T16:57:19.377 に答える
3

セグメンテーション違反は、そのappend(szo,c);時点szoでユニタライズされたポインタであり、ポインタを使用して書き込み先のメモリ位置を取得しようとする関数に渡されているため、おそらく行に起因します。

于 2012-10-15T16:58:56.003 に答える
3

これは、コードの他の場所にエラーがあることを意味します。投稿したコードにエラーはありません。ディスカッションは終了です。

更新: ため息

        s[len+1] = '\0';

間違っている。

デバッガーでコードを実行して、エラーが将来発生する行を確認してください。投稿したコードの行でさえなかったためです。

于 2012-10-15T16:51:42.160 に答える
1

s [len + 1]='\0';ではなくs[len]='\0'にする必要があります。また、他のユーザーが言ったように、szoは決して初期化されません。アクセス可能な場所である場合とそうでない場合があるランダムな場所を指します。セグメンテーション違反の原因

于 2012-10-15T16:57:27.253 に答える