You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决传递char (*)[64]给const char**参数的指针不兼容及段错误问题

解决C语言字符串排序的指针类型不匹配与段错误问题

错误原因分析

1. 二维字符数组传入时的类型与逻辑错误

你用char name[100][64]定义的是二维字符数组,&name[0]的类型是char (*)[64](指向64字符数组的指针),但你的sort函数参数是const char* arr,类型不匹配直接触发警告。更致命的是,qsort第三个参数你传了sizeof(const char*),但二维数组每个元素的实际大小是sizeof(char[64]),这会让qsort错误地分割数组元素,最终导致非法内存访问引发段错误。

另外,你的myCompare函数把void*强转成const char**,这只适用于指针数组场景;对二维数组来说,每个元素本身就是字符串,a指向的是数组元素的首地址,直接转成const char*即可,不需要二次解引用。

2. 指针数组未分配内存导致段错误

改用char* name[100]后,这个指针数组里的每个指针都是野指针(没有指向有效内存),直接用scanf("%s", name[i])会往随机内存地址写数据,必然触发段错误。

正确实现方式

方式一:基于二维字符数组的排序

修改函数参数类型适配二维数组,同时调整qsort的元素大小和比较函数逻辑:

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

#define MAX_NAME_LEN 64
#define MAX_NUM 100

// 适配二维字符数组的比较函数
static int myCompare(const void* a, const void* b) {
    // a、b指向二维数组中的单个char[64]元素,直接转成字符串指针即可比较
    return strcmp((const char*)a, (const char*)b);
}

// 参数改为指向char[64]的指针,匹配二维数组类型
void sort(int n, char arr[][MAX_NAME_LEN]) {
    // 每个元素的大小是char[64]的字节数
    qsort(arr, n, sizeof(arr[0]), myCompare);
}

int main() {
    int num;
    scanf("%d", &num);
    char name[MAX_NUM][MAX_NAME_LEN];
    
    // 输入字符串,限制长度避免缓冲区溢出
    for (int i = 0; i < num; i++) {
        scanf("%63s", name[i]);
    }
    
    sort(num, name);
    
    // 输出排序结果
    for (int i = 0; i < num; i++) {
        printf("%s\n", name[i]);
    }
    
    return 0;
}

方式二:基于指针数组的排序

先为每个指针分配有效内存,再处理输入和排序:

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

#define MAX_NAME_LEN 64
#define MAX_NUM 100

// 适配指针数组的比较函数
static int myCompare(const void* a, const void* b) {
    // a、b指向指针数组中的char*元素,解引用后得到字符串地址再比较
    return strcmp(*(const char**)a, *(const char**)b);
}

// 参数改为const char**,匹配指针数组类型
void sort(int n, const char** arr) {
    // 每个元素的大小是char*的字节数
    qsort(arr, n, sizeof(char*), myCompare);
}

int main() {
    int num;
    scanf("%d", &num);
    char* name[MAX_NUM];
    
    // 为每个指针分配内存,避免野指针
    for (int i = 0; i < num; i++) {
        name[i] = malloc(MAX_NAME_LEN * sizeof(char));
        if (name[i] == NULL) {
            perror("内存分配失败");
            return 1;
        }
    }
    
    // 输入字符串
    for (int i = 0; i < num; i++) {
        scanf("%63s", name[i]);
    }
    
    sort(num, name);
    
    // 输出排序结果并释放内存
    for (int i = 0; i < num; i++) {
        printf("%s\n", name[i]);
        free(name[i]);
    }
    
    return 0;
}

关键注意事项

  • 类型严格匹配:传给qsort的数组类型、元素大小、比较函数的类型转换必须完全一致,否则会触发内存错误。
  • 内存安全:使用指针数组时必须先分配有效内存;输入字符串时限制长度,防止缓冲区溢出。
  • 比较函数逻辑:二维数组的元素本身就是字符串,直接转成const char*即可;指针数组的元素是字符串指针,需要先解引用再进行字符串比较。

内容的提问来源于stack exchange,提问作者ident

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 08:10:08