C - 将 char 指针传递给函数的段错误

标签 c arrays pointers segmentation-fault

当我调用一个数组来标记 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/

相关文章:

python - 如何选择满足条件的行

arrays - 你如何在 swift 中对结构数组进行排序

c++ - 基类和派生类之间的不同调试器指针地址

C++ 不可能的指针行为

python - 使用 Python3 C API 覆盖对象方法

c - 读取 10 行整数的文件,将它们放入数组中,并输出数组

c - 免费 GSL 矩阵的正确方法是什么?

c - 如何等待30小时?

c++ - 如何从该对象中获取静态对象的值?

java - 需要使用循环打印出ArrayList中的总数