【问题标题】:Function pointer in C?C中的函数指针?
【发布时间】:2021-10-30 16:07:33
【问题描述】:

我是 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;
}

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

【问题讨论】:

    标签: c pointers malloc function-pointers void-pointers


    【解决方案1】:

    qsort(str,3,10,compare1); 错误。

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

    【讨论】:

    • 好的,所以我们需要传递 sizeof(指针),它基本上是 8 个字节。
    • @Hashinclude 可能是8字节或4字节或2字节。唯一真正正确的解决方案是使用sizeof
    • qsort(str, 3, sizeof *str, compare1) 优于qsort(str, 3, sizeof (char *), compare1),因为str 的类型发生变化时会自动调整,不易出现编辑错误。
    【解决方案2】:
    #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, sizeof(char *), compare1); //HERE WAS AN ERROR!
    
        for (i=0; i<3; i++) {
            printf("%s ", str[i]);
        }
        return 0;
    }
    

    qsort 的第三个参数采用数组元素的大小(在您的情况下,数组包含 char*,而不是 char[10])

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-23
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      • 2018-07-28
      • 1970-01-01
      相关资源
      最近更新 更多