当我调用一个数组来标记 unsigned int set[9] 中相应位位置的位位置及其在全局名称数组 names[320][30] 中的索引时,我遇到了段错误。当我运行程序时,我使用 ./a.out < data.dat 并在列表中加载 320 个单词的列表。均不超过 30 个字符。
此外,typedef unsinged int Set[10];
这是我调用 addName2Set 函数的代码
//add name to unsigned int set
void addName2Set(Set set, char *key){
int index;
//binary search to get index for key
index = binarySearch(names, key, 0, 319);
//call add2set to add index to set
add2Set(set, index);
}
这里是add2Set
//add value passed to set passed
void add2Set(Set set, int index){
int element, position;
//find which element, set[element] of set index is in
element = findArrayElement(index);
//convert index to bit position 0-31 in set[element]
position = findElementPos(element, index);
//in set[element], set bit position 'position' to 1
set[element] = set[element] | (1 << position);
}
这里是 findArrayElement 和 findElementPos 函数
//for unsigned int set[i], return i
int findArrayElement(int index){
//index range [j,i]
int i;
int j=0;
//element in set array
int element;
//loop through [j,i], return element if range true
for(i=31; i<320; i+=32){
if(i <= i && index >= j){
return element;
}
j+=32;
element++;
}
}
//find bit position 0-31 corresponding to index
int findElementPos(int element, int index){
int j;
int position;
j = element*32;
position = index - j + 1;
//return bit position
return position;
}
最后是我调用 addName2Member 函数的地方
//declare key pointer
char *key = (char*)malloc(30);
//set search word to pointer key
strcpy(key, "clean");
//addName2Set
addName2Set(set1,key);
有人知道为什么我运行程序时会出现段错误吗? “干净”是 data.dat 列表中的第一个词。
这是 valgrind 的结果
==1645== 大小为 4 的无效读取
==1645== 在 0x8048860: add2Set (set.c:61)
==1645== by 0x8048A5D: addName2Set (set.c:145)
==1645== by 0x80485D2: main (driver.c:29)
==1645== 地址 0x9DBED860 未被堆栈、malloc 或(最近)释放
==1645==
==1645== 进程以信号 11 (SIGSEGV) 的默认操作终止
==1645== GPF(指针越界?)
==1645== 在 0x8048860: add2Set (set.c:61)
==1645== by 0x8048A5D: addName2Set (set.c:145)
==1645== by 0x80485D2: main (driver.c:29)
最佳答案
看起来您在 findArrayElement
的末尾缺少 return 语句。这可能就是你的问题。
OP 在末尾使用 return -1
更正了 findArrayElement
之后:
请注意,您还需要检查从 findArrayElement
返回的 -1,否则您可能未对集合数组进行索引。
更新:
关闭 return 语句导致 OP 问题的确切原因是函数 promise 返回一个整数(它的返回类型是 int
),所以当没有 return 语句来设置 return值,存储返回值的内存/寄存器将包含“垃圾”(无论当时发生在内存/寄存器中)。发生 seg.fault 是因为垃圾“返回值”导致索引到数组以访问不属于应用程序的元素。这种行为是不稳定的,因为它取决于“垃圾”恰好是什么值(它甚至可能是一个在有效结果范围内的值),因此在某些情况下很难找到。
据我所知,防止此类错误发生的最佳方法是将编译器的警告级别设置为高,因此它会发出有关缺少返回语句的警告,并且还可能将编译器设置为将所有警告转换为错误 -- warnings通常描述应该解决的问题以避免可能的不良行为。如果程序员知道某个警告不是问题,则可以配置编译器(可能通过预处理器语句,尽管这不是一种可移植的方法,因为它依赖于编译器)忽略这些特定警告。
关于C - 将 char 指针传递给函数的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9918491/