首页 > 解决方案 > C. 将结构字段的第一个字符与循环中的数组元素进行比较。SIGSEGV

问题描述

我的方法确实有效(至少在我的编译器中)但有一个 SIGSEGV 信号(事后报告)。我想了解发生了什么错误。

函数打印“an”或“a”,取决于 p->field first char。
可以显示什么功能的示例(a/an):

Jack was an Astronaut 


或者

Jack was a Solider 


void display(const struct student_t* p)
{
    const char vovel[] = "aoeiuAOEIU";
    char article[3] = "a";
    for (unsigned int i=0; i<sizeof(vovel); i++) {
        if (p->field[0]==vovel[i]) //<-------here it detects SIGSEGV.
            strcpy(article, "an");
    }
    if (p!=NULL)
        printf("%s was %s %s\n", p->name, article, p->field);
} 

结构可以是:

struct student_t
{
    char name[20];
    char field[50];
};


那有什么问题?
我在想也许我做错了是我访问 p->field 的第一个符号的方式......或者它可能与我的元音数组的最后一个符号'\0'..有关?
或者可能是 SIGSEGV 是由我的程序的另一部分引起的,但在这里被检测到?我在其他地方使用了类似的循环,clang 检测到“超出范围的内存访问(访问超出内存块的上限) - 逻辑错误错误”在另一个循环中(发布在下面),我基于我的“vovel”检测功能......

const char* find(const char * start, char **end, char **next, const char *delims) {
    static const char blanks[] = " \t\r";
    start += strspn(start, blanks);
    *end=NULL;
    *end = strpbrk(start, delims); //<-- cpp check: Either the condition 'end==0' is redundant or there is possible null pointer dereference: end. -- warning
    if (end == NULL) {
        return NULL;
    }
    *next = *(end) + 1;
    while(*end > start) {
        bool found = false;
        for (unsigned int i=0; i<sizeof(blanks); i++) {
            if ((*end)[-1] == blanks[i]) { //<-- clang: Out of bound memory access (access exceeds upper limit of memory block) -- Logic error bug
                --*end ;
                found = true;
                break;
            }
        }
        if (!found) break;
    }
    return start;
}

非常感谢所有的帮助!

标签: carraysstructure

解决方案


推荐阅读