0

ここでは、基本的に文字列を入力し、それを個々の単語に分割し、各単語を char ポインターにptr[i]割り当てようとしています。次のコードを実行すると、複数の単語の文字列を入力すると、 が表示されます

Segmentation fault (core dumped)

デバッグには gdb を使用しました。しかし、while ループを 2 回目にアクセスした後、それに対する解決策は、使用する前

Program received signal SIGSEGV, Segmentation fault. 0x0000003b64a81321 in __strlen_sse2 () from /lib64/libc.so.6

にそれぞれにメモリを割り当てることです。しかし、ptr[0] にメモリ割り当てが必要ないのはなぜでしょうか。ptr[0] にメモリを割り当てないと、他の何かが上書きされる可能性はありますか? 私は好奇心からそれを求めています.メモリを割り当てる方が常に良いことを知っています. コードは次のとおりです。ptr[i]strcpy(ptr[i],cp);

ptr[i]=new char[sizeof(cp)];


#include<iostream>
#include<cstring>
#include<string>
using namespace std;

int main()
{   
    int i,j;
    string s1;
    getline(cin,s1);
    char s[100],*ptr[10];
    strcpy(s,s1.c_str());
    char *cp;

    cout<<"string is:  "<<s1<<endl;
    cp=strtok(s," ");
    i=0;
    while(cp!=NULL)
    { cout<<cp<<endl;
      strcpy(ptr[i],cp);
      cp=strtok(NULL," ");
      i++;
    }

    for(j=0;j<i;j++)
    { cout<<ptr[j]<<endl;
    }
    return 0;
}
4

4 に答える 4

0

ptr[0] を使用しているときにセグメンテーション違反が発生しない場合もありますが、常にそうであるとは限りません。また、ポインターが指しているオブジェクトに値を割り当てる前に、ポインターにメモリを割り当てることをお勧めします。

于 2013-08-23T05:41:14.140 に答える
0

実際には、次の行が原因でセグメンテーション違反が発生します。

strcpy(ptr[i],cp);

ptr[i]または のいずれnewかでメモリを割り当ててからmallocコピーすると、それはサンプされません。

于 2013-08-23T06:20:56.883 に答える