为什么memcpy第二次尝试不起作用?

时间:2012-10-27 20:06:39

标签: c segmentation-fault memcpy

memcpy在我的程序中表现得很奇怪。我的函数被调用两次,所以memcpy行运行两次,第一次运行没问题,第二次我在该行得到一个seg错误(使用gdb)。我很困惑,因为我不明白为什么它会工作一次而不是两次......而且,我输入的两个名字长度相同。

这就是我的......

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);

关于为什么这可能不起作用的任何想法?

2 个答案:

答案 0 :(得分:3)

在这种情况下唯一可能的罪魁祸首似乎是:

(1)malloc()失败 - 您没有检查NULL结果

(2)先前的腐败已经破坏了事情。

您可以通过读取内存来获取段错误,因此如果源参数不是0终止并且在找到可读的0字节之前发生错误(并且在超越500-char接收阵列之前导致错误,则可能添加第三个选项)其他问题。)那些短字符串文字不会发生这种情况,所以像这样的东西都必须属于(2)。

您的片段被黑客入侵主程序(内存泄漏等)并没有让我失望。 (请参阅hnhzflep的答案,了解更详尽的演示 - 不要爆炸。

答案 1 :(得分:1)

哦,okaaay然后。好吧,你需要查看你的代码。特别是你给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++;
    }
}