0

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

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

4

2 回答 2

3

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

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

(2)以前的腐败已经打乱了事情。

您可以通过读取内存来获得段错误,因此如果源参数不是以 0 结尾并且错误发生在找到可读的 0 字节之前(并且在超出 500 字符接收数组导致其他问题之前),则可能会添加第三个选项。 ) 那些短字符串文字不会发生这种情况,所以像这样的任何事情都必须属于 (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 回答