当我调用一个数组来标记无符号int集[9]中对应位位置的位位置时,得到一个分段错误,它的索引在全局名称数组名[320][30]中。当我运行程序时,我使用./a.out另外,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);
}
这是add2集合
//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);
}
这是findarrayement和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);
有人知道我运行程序时为什么会出现分段错误吗?”“Clean”是data.dat列表中的第一个单词。
这是瓦尔格林的结果
==1645==无效读取大小4
==1645==0x8048860:add2Set(set.c:61)
==1645==by 0x8048A5D:addName2Set(set.c:145)
==1645==BY0x80485D2:主(驱动程序c:29)
==1645==Address 0x9DBED860不是stack'd、malloc'd或(最近)free'd
==1645个==
==1645==用信号11的默认动作终止进程(SIGSEGV)
==1645==GPF(指针越界?)
==1645==0x8048860:add2Set(set.c:61)
==1645==by 0x8048A5D:addName2Set(set.c:145)
==1645==BY0x80485D2:主(驱动程序c:29)
最佳答案
看起来您在findArrayElement
结尾缺少一个return语句。这可能是你的问题。
在手术结束后用afindArrayElement
校正return -1
:
请注意,您还需要检查从-cc>返回的-1,否则可能会对集合数组进行索引不足。
更新:
关闭return语句的确切原因是OP的问题,因为函数承诺返回一个整数(它的返回类型是findArrayElement
),所以当没有return语句设置返回值时,存储返回值的内存/寄存器将包含“垃圾”(当时内存/寄存器中发生的任何情况)。因为垃圾“返回值”导致数组中的索引访问不属于应用程序的元素,所以发生了SeG.Tebug。这种行为是不稳定的,因为它取决于“垃圾”的值(它甚至可能是一个在有效结果范围内的值),因此在某些情况下很难找到。
我所知道的防止此类错误发生的最好方法是将编译器的警告级别设置为高级别,这样它会发出有关缺少返回语句的警告,还可能设置编译器将所有警告转换为错误--警告通常描述应该解决的问题,以避免可能出现的不良行为。如果程序员知道某个警告不是问题,则可以配置编译器(可能通过预处理器语句,尽管这不是一种可移植的方法,因为它依赖于编译器)来忽略这些特定警告。
关于c - C-将char指针传递给函数的段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9918491/