1

次のコードの fork は機能しません! run 関数には入りません。ここで何が間違っているのか教えてください。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void run(char* a)
{
    char* k=a;
    int i;
    for(i=0;i<3;i++)
      k[i]='s';
    printf("hi");
    return;
}
int main()
{   
    char* a="cbd";
    pid_t j;
    j=fork();
    printf("%d\t",j);
    int y;
    if(j==0)
      run(a);
    int i;
    for(i=0;i<3;i++)
      printf("%c\t",a[i]);
 return 0;
}

出力は

24180  c b d
4

3 に答える 3

4

実際run()に関数が呼び出されます。しかし、k[i]='s';ステートメントの問題。「cbd」は文字列リテラルで読み取り専用です。

string のメモリをローカルに割り当て、アドレスを渡します。

@Andyが述べたように、子プロセスがクラッシュしました。

于 2013-07-10T04:50:05.987 に答える
1

問題は にありk[i] = 's'、バス エラーでプロセスがクラッシュします。その理由は、読み取り専用メモリに格納されるオブジェクト ファイルの RODATA セクションに配置されている文字列リテラル "cbd" を編集しようとしているからです。メインの最初の行をchar a[3] = {'c', 'b', 'd'};プログラムに変更すると、期待どおりに機能します。

于 2013-07-10T04:56:02.600 に答える
1

fork() については問題ありません。それはあなたの run() 関数です。k は const 文字列へのポインタであるため、k[0]='s' はアクセス違反を報告する傾向があります。

于 2013-07-10T04:57:29.587 に答える