C中的函数指针?

Has*_*ude 0 c malloc pointers function-pointers void-pointers

我是 C 语言初学者,正在学习 C 语言中的函数指针。还有我遇到的问题?

编写一个比较函数来按名称的第一个字符排序?

*int (firstnamecharcompar)(const void * a, const void * b))

这是我的代码解决方案。

#include<stdlib.h>
#include<stdio.h>
#include <stdbool.h>

int compare1(const void *a,const void *b)
{
    char *c = *(char**)a;
    char *d = *(char**)b;
    return c[0] - d[0];                             
    //return ( *(char*)a[0] == *(char*)b[0] );                
}

int main()
{
    char* str[3];
    int i;
    for(i=0;i<3;i++)
    {
        str[i] = (char*)malloc(10*sizeof(char));
    }
    for(i=0;i<3;i++)
    {
        printf("Enter %d string => " , i+1 );
        scanf("%s", str[i]);                        
        printf("\n");
    }
    
    for(i=0;i<3;i++)
    {
        printf("%s ",str[i]);
    }
    
    qsort(str,3,10,compare1);
    
    for(i=0;i<3;i++)
    {
        printf("%s ",str[i]);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是我的代码在没有给出任何输出的情况下被终止了?我的代码有什么问题?

n. *_* m. 5

qsort(str,3,10,compare1); 是错的。

您正在对指针数组进行排序。您需要传入指针的大小,而不是它指向的对象的大小。也就是说,sizeof(char*)而不是10

  • @Hashinclude 可能是 8 个字节或 4 个字节或 2 个字节。唯一真正正确的解决方案是使用 `sizeof` (2认同)
  • `qsort(str, 3, sizeof *str, compare1)` 比 `qsort(str, 3, sizeof (char *), compare1)` 更可取,因为如果 `str` 的类型改变它会自动调整,所以它不太容易出现编辑错误。 (2认同)