memset() 行为异常

Posted

技术标签:

【中文标题】memset() 行为异常【英文标题】:memset() behaving undesirably 【发布时间】:2011-12-14 11:48:25 【问题描述】:

我在 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 的字节有问题。

【问题讨论】:

'//一些内存地址'从何而来?是否分配了malloc? 尝试使用gcc -g -Wall 编译您的代码并使用gdb(或者也可以使用valgrind)进行调试 @PeskyGnat 它的内存地址来自堆栈。 我已经编辑了我的问题。请看一下。 【参考方案1】:

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

套用查尔斯·巴贝奇的话说:当您将错误的代码输入机器时,就会出现错误的答案。

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

【讨论】:

以上是关于memset() 行为异常的主要内容,如果未能解决你的问题,请参考以下文章

C中memset的行为[重复]

为啥结构数组的 memset 会改变程序行为?

memcpy() 和 memset() 的奇怪行为 [关闭]

为啥我在使用 memset 用零填充对象后在 dynamic_cast 出现异常

在 STM32 上调用 memset 时出现硬故障异常

老生常谈,正确使用memset