memset()表现得不合需要

时间:2011-12-14 11:48:26

标签: memset

我在C中使用memset函数并遇到问题。这是我的问题:

char* tail;
tail = //some memory address
int pbytes = 5;

当我调用memset时:

**memset(tail+pbytes, 0 , 8); // It gives no error**

当我调用memset时:

**memset(tail+pbytes, 0 , 9); // It goes into infinite loop**

当我调用memset时:

**memset(tail+pbytes, 0 , 10); // last parameter (10 or above). It gives Segmentation fault**

这可能是什么原因?程序根据需要运行并提供输出,但最终会产生分段错误。我正在使用Linux 64虚拟机。

任何帮助都将不胜感激。

确定。让我用我正在做的事情澄清一下。我正在制作128个字节(数组中为0-127)数据。我从字节112到119写0(NULL)(它顺利)但是当我尝试在第120个字节写0并运行程序时,它进入无限循环。如果我在第120个字节写1,2,4,6,程序运行良好。如果我在第120个字节写入其他数字,程序会给出分段错误。基本上从120到127的字节有问题。

1 个答案:

答案 0 :(得分:0)

memset没有错。你如何定义指针变量tail是错误的。

如果你只是写了

    char tail[128];
    memset(tail+5, 0, 9);

当然它会正常工作。你的问题是,你没有做任何简单和正确的事情;你正在做一些模糊和不正确的事情,比如

    char tail[1];
    memset(tail+5, 0, 9);

void foo(int x) {
    char *tail = &x;
    memset(tail+5, 0, 9);
}

用Charles Babbage的话说:当你把错误的代码放入机器时,会出现错误的答案。

段错误可能是因为您正在尝试写入尚未分配的虚拟地址。无限循环可能是因为你覆盖了memset的返回地址的某些部分,因此它返回到错误的位置(例如进入无限循环的中间)而不是返回到它被调用的地方。