c - 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;
}
非常感谢所有的帮助!
解决方案
推荐阅读
- mysql - 计数 DISTINCT 时出现错误 1064
- r - 如何将字符类中的阿拉伯数字转换为R中的英文数字?
- c - 在 C 中编译 Tesseract OCR
- x86 - Skylake and newer Ring Bus
- c++ - C++ | Win32 API | 卡在白屏| 无效矩形()
- java - 为什么我在编译时似乎找不到我的程序中的错误。需要帮助
- operating-system - 为什么像 WRITE(2) 这样的系统调用不提供缓冲区来提高速度?
- javascript - 如何以一种不会中断使用普通的旧 vanilla JavaScript 访问对象的方式导出 TypeScript 类
- php - 使用 yahoo 电子邮件地址帐户时无法发送消息
- powerbi - 仅显示最后一列的总计