C-将字符指针传递给函数的分段错误
当我调用一个数组,用其在全局名称数组名称[320][30]中的索引标记无符号int集合[9]中相应位位置的位位置时,我遇到了一个分段错误。当我运行程序时,我使用./a.outC-将字符指针传递给函数的分段错误,c,arrays,pointers,segmentation-fault,C,Arrays,Pointers,Segmentation Fault,当我调用一个数组,用其在全局名称数组名称[320][30]中的索引标记无符号int集合[9]中相应位位置的位位置时,我遇到了一个分段错误。当我运行程序时,我使用./a.out
typedef非单精度整数集[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);
}
有人知道为什么我运行程序时会出现分段错误吗?“Clean”是data.dat列表中的第一个单词
以下是valgrind的结果
==1645==大小为4的读取无效
==1645==at 0x8048860:add2Set(set.c:61)
==1645==0x8048A5D:addName2Set(set.c:145)
==1645==0x80485D2:main(driver.c:29)
==1645==地址0x9DBED860不是堆栈、malloc或(最近)空闲
==1645==
==1645==进程以信号11(SIGSEGV)的默认动作终止
==1645==GPF(指针超出范围?)
==1645==at 0x8048860:add2Set(set.c:61)
==1645==0x8048A5D:addName2Set(set.c:145)
==1645==0x80485D2:main(driver.c:29)没有看到整个程序(包括findarrayement()
和findElementPos()的定义),很难说
您可以使用蛮力方法在GDB中运行程序:
gdb ./a.out
从GDB外壳调用
run < data.dat
查看程序中发生segfault的确切位置。如果看不到整个程序(包括findArrayElement()
和findElementPos()
的定义),很难判断
您可以使用蛮力方法在GDB中运行程序:
gdb ./a.out
从GDB外壳调用
run < data.dat
要查看程序中发生segfault的确切位置。如果程序名为a.out,则使用如下命令
valgrind--tool=memcheck a.out
然后valgrind将在一个特殊的内存中运行你的程序,它将告诉你哪里出错了。不要忘记使用gcc-g
将调试信息添加到你的bin文件中。如果你的程序名为a.out。然后,像这样使用
valgrind--tool=memcheck a.out
然后valgrind将在一个特殊的内存中运行你的程序,它将告诉你哪里出错了。不要忘记使用gcc-g
将调试信息添加到你的bin文件中。看起来你在findarrayement
的末尾缺少一个return语句。这可能就是你的问题所在
操作完成后,使用返回-1
在末尾更正findArrayElement
:
请注意,您还需要检查从findarrayement
返回的-1,否则可能会对集合数组索引不足
更新:
关闭return语句导致OP出现问题的确切原因是函数承诺返回一个整数(它的返回类型是int
),因此当没有return语句来设置返回值时,存储返回值的内存/寄存器将包含“垃圾”(无论当时内存/寄存器中发生了什么)。之所以发生seg.fault,是因为垃圾“返回值”导致对数组进行索引以访问不属于应用程序的元素。此行为不稳定,因为它取决于“垃圾”恰好是什么值(它甚至可能是一个在有效结果范围内的值),因此在某些情况下很难找到
我所知道的防止此类错误发生的最佳方法是将编译器的警告级别设置为高级别,这样它会对缺少的返回语句发出警告,并且可能还会将编译器设置为将所有警告都转换为错误--警告通常描述为避免可能的不良行为而应解决的问题n警告程序员知道这不是问题,可以配置编译器(可能通过预处理器语句,尽管这不是一种可移植的方法,因为它依赖于编译器)忽略这些特定警告。看起来您在findArrayElement
末尾缺少一条return语句。这可能就是您的问题所在
操作完成后,使用返回-1
在末尾更正findArrayElement
:
请注意,您还需要检查从findarrayement
返回的-1,否则可能会对集合数组索引不足
更新:
关闭return语句导致OP出现问题的确切原因是函数承诺返回一个整数(它的返回类型是int
),因此当没有return语句来设置返回值时,存储返回值的内存/寄存器将包含“垃圾”(无论当时内存/寄存器中发生了什么)。之所以发生seg.fault,是因为垃圾“返回值”导致对数组进行索引以访问不属于应用程序的元素。此行为不稳定,因为它取决于“垃圾”恰好是什么值(它甚至可能是一个在有效结果范围内的值),因此在某些情况下很难找到
我所知道的防止此类错误发生的最佳方法是将编译器的警告级别设置为高级别,这样它会对缺少的返回语句发出警告,并且可能还会将编译器设置为将所有警告都转换为错误--警告通常描述为避免可能的不良行为而应解决的问题n警告程序员知道这不是问题,可以配置编译器(可能通过预处理器语句,尽管这不是一种可移植的方法,因为它依赖于编译器),以忽略那些特定的wa
bt