在Mac OS X上使用memchr()时遇到溢出问题。

这是我的测试代码:

#include <stdio.h>
#include <stdlib.h>

int main(void){
    char *content="http\r\nUser";
    int content_size = strlen(content);
    char *contmem = malloc(content_size+1);
    memset(contmem, '\0', content_size+1);
    memcpy(contmem, content, content_size);
    printf("%c\n", *(content+content_size));
    printf("%c\n", *(contmem+content_size));
    char *t = memchr(content, 't', content_size);
    printf("%c\n", *t);
    return 0;
}

它可以在Linux(即我的fedora 16)上正常工作,并输出正确的t值。
但是,当我在Mac上运行同一段代码时,就会出现Segmentation Fault!

用gdb调试后,我会说:
(gdb) print t
$7 = 0xf4b <Address 0xf4b out of bounds>

然后,我尝试在此测试文件中重写memchr函数:
static char*
memchr(const char *data, int c, unsigned long len){
    char *tp = data;
    unsigned long i;
    for( i = 0; i<len; i++){
        if((int)*tp == c){
            return tp;
        }else{
            tp = tp+1;
        }
    }
}

输出似乎正确!
 (gdb) print t
 $1 = 0x100000f1d "ttp\r\nUser"

因此,我对memchr()在mac os上的异常行为感到困惑,而其他mem函数(如memset()memcpy())可以正常工作。

如何在不重写Mac上的memchr()的情况下运行测试?

谢谢。

最佳答案

函数 memchr() string.h中声明,发布的代码中没有include指令。这意味着编译器将生成隐式函数声明(应发出警告),该声明将返回int。如果您的系统上的sizeof(int)sizeof(char*)不同,则可以解释此问题。添加:

#include <string.h>

关于c - 为什么Mac OS上的memchr()会发生越界,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12835584/

10-12 16:01