0

....こんにちは、コードの実行中に常に「セグメンテーション エラー」が発生します。ファイルへの書き込みに問題があるときにこのエラーが発生することを私が知っていること(共有メモリについても同じことが言えると思います)、エラーがforループから来ていることを知っています、私はこのエラーを解決するためにあらゆることを試みましたが失敗しました(私もfor ループを削除し、*s = 'A' と入力しただけです。

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdlib.h>

main()
{
    //Shared memory parameters
    int shmid ;
    int shmsize = 14;
    key_t key = 2121;
    char *shm, *s;
    //Create SMS
    if ((shmid = shmget (key , shmsize, 0666 | IPC_CREAT)) == -1) { 
        perror ("Error in Creating the SMS");
        abort();
    }
    //Attatching the sms to the address space
    if (shm = shmat(shmid , NULL , 0) == (char *)-1) {    /*<<<< 23 */
        perror ("Error in attatching the SMS");
        abort();
    }
    int i ;
    s = shm;
    for(i = 0 ; i <= 63 ; i++)
        *s++ = (char)i;
        *s = NULL;    /*<<<< 33 what's the problem */
}

また、23 と 33 の両方で警告が表示されます

4

1 に答える 1

1

コンパイラの警告に耳を傾ける必要があります (7 行目の警告も表示されるはずmainです。そうでない場合は-Wall、コンパイラ スイッチに追加する必要があります)。

したがって、23行目では、「キャストなしで整数からポインターを作成する」と書かれています[1]:

  if (shm = shmat(shmid , NULL , 0) == (char *)-1)

これは、あなたのコード行が、あなたがすべきだと思っていることをしていないからです。別の行に分割すると、より明確になりますね。

  shm = shmat(shmid , NULL , 0) == (char *)-1;
  if (shm)

そのため、shm は「からの戻り値shmat(...) == -1。これはゼロであることが望ましいです。次に、に割り当てます。これは、アドレス 0 に書き込もsうとshmすることを意味します。*s++これは間違いなくセグ フォールトを引き起こすはずです。

これを修正するには、括弧を追加して最初に割り当てを行い、次に比較 (shmid = shmget上記の数行のように) を行うか、次のように分割します (私の推奨する解決策):

  shm = shmat(shmid , NULL , 0);
  if (shm == (char *)-1)

この行:

                 *s = NULL;  //what's the problem

(void *)0値に NULL (したがってポインター) を割り当てようとしているため、間違っていcharます。次の 2 行のいずれかでこれを修正します。

*s = '\0';
*s = 0;

以下のコメントのとおり: また、保存したいコンテンツをカバーするように共有メモリのサイズを調整する必要があります。現在、14 バイトを要求してから 64 を書き込みます。これは失敗しませんが、サイズが 4096 バイトに切り上げられるためです。要求しているものについて OS に「嘘をつかない」ことが重要です。たまに逃げたら…

[1] 実際の警告メッセージを投稿すると、常に役に立ちます。これにより、警告を見つけるためにコードをコンパイルする必要がなくなります...

于 2013-02-23T16:23:41.607 に答える