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++;
}
}