0

memcpyは私のプログラムで奇妙な振る舞いをしています。私の関数は2回呼び出されるので、memcpy行は2回実行されます。最初は問題なく動作し、2回目はその行でセグメンテーション違反が発生します(gdbを使用)。なぜ1回は機能するのに、2回は機能しないのかわからないため、混乱しています...また、入力した2つの名前は同じ長さです。

これは私が持っているものです...

typedef struct _item_
{
    char name[500];
}item;


int my_function(char *name)
{

    item *myitem = malloc(sizeof(item));

    char* temp = myitem->name;

    strcpy(temp, name);

    /* code here to write add item to a global structure */

    return 0;

}

コードのテストで...

int i;
i = my_function("test1");
.
.
.
i = my_function("test2");

次に、strcpyに変更しましたが、同じ問題が発生します

strcpy(temp, name);

なぜこれが機能しないのかについてのアイデアはありますか?

4

2 に答える 2

3

この場合の唯一の考えられる原因は次のようです。

(1)malloc()が失敗します-NULLの結果をチェックしませんでした

(2)以前の腐敗が物事を混乱させた。

メモリを読み取ることでセグメンテーション違反が発生する可能性があるため、ソース引数が0で終了しておらず、読み取り可能な0バイトを見つける前に(および500文字の受信配列をオーバーランする前に)障害が発生した場合は、3番目のオプションが追加される可能性があります。 )これらの短い文字列リテラルでは発生しないため、このようなものは(2)に該当する必要があります。

メインプログラム(メモリリークなど)にハッキングされたスニペットは、私にとって失敗しませんでした。(爆発しない、より徹底的なデモについては、hnhzflepの回答を参照してください。

于 2012-10-27T21:10:18.970 に答える
1

ああ、それならオーケー。さて、あなたはあなたのコードを見る必要があります。具体的には、memcpyまたはstrcpyに指定した宛先ポインターが指しているものです。あなたのメッセージは、あなたが所有していないメモリに書き込もうとしていることを明確に示しています。これは、提供したコードを使用する最小限のコンパイル可能なバージョンです。それはうまく機能します。関数が20,000回呼び出され、有効な結果が返されます。これは、20,000個の要素がすべて印刷されたときに確認されます。

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

typedef struct _item_
{
    char name[500];
}item;

item *my_function(char *name)
{
    item *myItem = (item*)malloc(sizeof(item));
    strcpy(myItem->name, name);
    return myItem;
}

int main()
{
    const int max = 10000;  // 10,000 iterations
    item *itemList[max*2];  // 2 operations per loop iteration
    int j, index = 0;
    for (j=0; j<max; j++)
    {
        itemList[index++] = my_function("test1");
        itemList[index++] = my_function("test2");
    }

    index = 0;
    for (j=0; j<max; j++)
    {
        printf("%d. - %s\n", 1+index, itemList[index]->name);
        index++;
        printf("%d. - %s\n", 1+index, itemList[index]->name);
        index++;
    }
}
于 2012-10-27T20:53:12.987 に答える