错误:地址为KERN_INVALID_ADDRESS:0x00000000000000 0x00007fff99b359c4 in strstr()

时间:2013-02-10 20:41:40

标签: c

我在Mac OS X上编写了一个小程序但是我在以下函数中遇到以下错误:

  

程序收到信号EXC_BAD_ACCESS,无法访问内存。   原因:KERN_INVALID_ADDRESS位于地址:0x0000000000000000   strstr()

中的0x00007fff99b359c4
/*
 * attrvalue(): parse an attribute value pair.
 *
 * takes a string of the form "ATTRIBUTE = VALUE" and returns the atrribute name
 * and value as seperate strings
 *
 */
  int
 attrvalue(char *entry, char **attr, char **value)
 {
    char           *copy;
    char           *p;

    if (!entry || *entry == '\0')
            return 1;

    copy = strdup(entry);

    *attr = strtok(copy, "=");
    *value = strtok(NULL, "\n");

    /* strip training whitespace from attr and value */
    p = strstr(*attr, "     ");
    if(p)
      *p = '\0';
    p = strstr(*value, "   ");
    if(p)
      *p = '\0';
    return (0);
}

知道这个函数有什么问题吗?

感谢。

1 个答案:

答案 0 :(得分:0)

修订回答: 如果你假设在attr或value的开头没有空格(即,行的开头和attr字符串之间没有空格,或者是等号和值字符串),那么你的程序就可以了只需稍微调整即可:将第二个参数中的多个空格更改为strstr()到单个空格。修改后的代码用main()来演示如下。如果你想剥离非尾随空格,那么,当你扩展问题或从我原来答案中的链接借用时,很可能会回到调试器。

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

/*
 * attrvalue(): parse an attribute value pair.
 *
 * takes a string of the form "ATTRIBUTE = VALUE" and returns the atrribute name
 * and value as seperate strings
 *
 */
  int
 attrvalue(char *entry, char **attr, char **value)
 {
    char           *copy;
    char           *p;

    if (!entry || *entry == '\0')
            return 1;

    copy = strdup(entry);

    *attr = strtok(copy, "=");
    *value = strtok(NULL, "\n");

    /* strip trailing whitespace from attr and value */
    p = strstr(*attr, " ");
    if(p)
      *p = '\0';
    p = strstr(*value, " ");
    if(p)
      *p = '\0';
    return (0);
}

int main()
{
    char *input = "asdf    =blah ";  // this works
    //char *input = " asdf = blah";  // this would not
    char *attr;
    char *value;

    attrvalue(input, &attr, &value);

    printf("attr =\"%s\"", attr);
    printf("value=\"%s\"", value);

    return 0;
}

原始答案: 我会使用另一种剥离空格的方法,因为它甚至不清楚strstr()在这种情况下如何工作。这是strstr() documentation,这里是SO topic discussing the removal of whitespace in C

结合其他想法:

  • if(p)应为if(p != NULL),作为尼特。
  • 如果strstr()的第二个参数比第一个参数长?
  • 怎么办?