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);
关于为什么这可能不起作用的任何想法?
答案 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++;
}
}