0

私のコードは機能しません。文字列を受け入れた瞬間に実行時エラーが発生します。このコードの問題は何ですか?

//this is what i have in main()
char *ele,*s[max];
int *count,temp=0;
count=&temp;   
printf("Enter string to insert: ");
scanf("%s",ele);
addleft(s,ele,count);

//following is the function definition
void addleft(char *s[max],char *ele,int *count)
{
    int i;
    if((*count)==max)
    {
        printf("Queue full!\n");
        return;
    }
    for(i=*count;i>0;i--)
        strcpy(s[i],s[i-1]);
    strcpy(s[0],ele);
    (*count)++;
    printf("String inserted at left!\n");
}
4

3 に答える 3

3

eleは初期化さchar*れておらず、メモリが関連付けられておらずscanf()、書き込みを試みて未定義の動作を引き起こします。セグメンテーション違反が発生している可能性があります。

ローカル配列にメモリを動的に割り当てるeleか宣言して、次を使用するときにバッファオーバーランを防ぐ必要がありscanf()ます。

char ele[1024];
if (1 == scanf("%1023s", ele))
{
    /* Process 'ele'. */
}

さらに、関数はonaddleft()を使用しています。これはの配列であり、配列内の各は単一化されています。これは未定義の動作であり、セグメンテーション違反の可能性があります。修正するには、他の方法で利用できる場合に使用できます。strcpy()schar*char*strdup()malloc()strcpy()

/* Instead of:
       strcpy(s[0],ele);
   use:
 */
s[0] = strdup(ele);

for関数内のループは、含まれているものが必ずしも同じ長さであるとは限らないため、addleft()危険であることに注意してください。これは、配列の終わりを超えて書き込むことに簡単につながる可能性があります。ただし、要素は動的に割り当てられたアドレスであるため、コンテンツをコピーする代わりに要素を交換するだけで済みます。char*schar*

于 2012-10-09T16:32:26.230 に答える
0

sscanf( "%s"、ele)は、'ele'が指すメモリに入力を入れています。しかし、「ele」は何かを指すように初期化されたことはありません。何かのようなもの:

char ele[128];

また

char* ele = malloc(...)

それを修正する必要があります。

于 2012-10-09T16:34:24.480 に答える
-1

eleポインタが割り当てられたメモリを指していないため、バッファオーバーフローが発生しています。プログラムを実行する必要があることをメモリに書き込んでいるため、プログラムがクラッシュします。malloc次のようにプログラムに実装することをお勧めします。

char *ele;
if (!(ele = malloc(50))) //allocate 50 bytes of memory 
{
    //allocation failed
    exit(0);
}
scanf("%s", ele); //string can hold 50 bytes now
free(ele);        //free allocated space

ここmallocで関数を読みたいと思うかもしれません

より簡単なルートはele、ポインターの代わりに配列を作成することです。

char ele[50]; //ele is an array of 50 bytes 
于 2012-10-09T16:37:44.597 に答える