C-为什么Memcpy在第二次尝试中不起作用



memcpy在我的程序中以一种奇怪的方式行事。我的功能被称为两次,因此,纪念行是两次运行,这是第一次毫无问题,第二次围绕该线路(使用GDB)就会出现SEG故障。我很困惑,因为我不明白为什么它会起作用一次,但不能两次……而且,我输入的两个名称是相同的长度。

这就是我拥有的...

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

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

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

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

(2)先前的腐败已经扰乱了事物。

您可以通过读取内存获得段故障,因此,如果源参数不是0端的,则可能会添加第三个选项,并且在找到可读取的0字节之前发生故障(并且在超越500-Char接收阵列原因之前其他问题。

您的摘要,被黑客入侵的主程序(内存泄漏和所有)并没有失败。(有关更详尽的演示,请参见HNHZFLEP的答案。

哦,然后。好吧,您需要查看您的代码。特别是在您给出的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. - %sn", 1+index, itemList[index]->name);
        index++;
        printf("%d. - %sn", 1+index, itemList[index]->name);
        index++;
    }
}

相关内容

  • 没有找到相关文章

最新更新