Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C-将字符指针传递给函数的分段错误_C_Arrays_Pointers_Segmentation Fault - Fatal编程技术网

C-将字符指针传递给函数的分段错误

C-将字符指针传递给函数的分段错误,c,arrays,pointers,segmentation-fault,C,Arrays,Pointers,Segmentation Fault,当我调用一个数组,用其在全局名称数组名称[320][30]中的索引标记无符号int集合[9]中相应位位置的位位置时,我遇到了一个分段错误。当我运行程序时,我使用./a.out

当我调用一个数组,用其在全局名称数组名称[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