c - 我正在学习 "Function callback"并且我的代码中出现了段错误?

标签 c function callback

<分区>

#include <stdio.h>
#include <math.h>

void swap(char* x, char* y)
{
  char temp;
  temp = *x;
  *x = *y;
  *y = temp;
}

int compare(char a, char b)
{
  if((int)a > (int)b)
  {
    return 1;
  }
  return -1;
}

int bubbleSort(char *a, int n, int (*compare) (char, char))
{
  int i, j;
  for(i = 0; i < n; i++)
  {
    for(j = 0; j < n - 1; j++)
    {
      if(compare(a[j], a[j + 1]) > 0)
      {
        swap(&a[j], &a[j + 1]);
      }
    }
  }
} 

void main()
{
  char* name = "Stackoverflow";
  int i;
  bubbleSort(name, sizeof(name) / sizeof(char), compare);
  for(i = 0; sizeof(name) / sizeof(char); i++)
    printf("%c ", name[i]);
}

我不知道这段代码为什么会出现段错误,我知道发生段错误的情况,即当应用程序试图访问其专用内存之外的内存位置时。

最佳答案

错误不在您的冒泡排序实现中,而是在main 中:您已将name 定义为指向字符串文字的指针,这意味着您无法修改其内容.请改用字符数组。

您还需要 strlen 来确定要排序的字符串的长度。 sizeof 将为您提供存储字符串的缓冲区的大小,这将大于以 null 结尾的字符串的长度。

最后,考虑使用字符串的标准打印例程之一打印排序后的字符串,而不是逐个字符地打印它。

最后,您不会从 bubbleSort 返回任何内容,因此将其设为 void

这是你的 main 应该是这样的:

    #include <string.h>

    // bubble sort implementation

    int main(void)
    {
        char name[] = "Stackoverflow";

        bubbleSort(name, strlen(name), compare);

        puts(name);
        return 0;
    }

关于c - 我正在学习 "Function callback"并且我的代码中出现了段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36195350/

相关文章:

python,绘图和c api

c - 数组和链表之间的内存使用

python - 如何将带有参数的函数作为参数传递给Python中的另一个函数(函数名作为字符串)?

android - 在 Android 中创建类似 Facebook API 的 WebView 弹出窗口

javascript - Ajax 链式回调

c - 当内核需要紧急释放内存时,JBD2中的检查点如何管理?

c - 从文件中读取C编程

javascript - 从另一个文件调用函数并在完成后获取结果?

c - 在 C 中通过引用传递动态长度的二维结构数组

javascript - 回调引用作为 Javascript 中的参数