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

拆分字符串存入数组遇错误:‘char *[10]’非函数或函数指针求助

解决你的字符串拆分代码报错问题

嘿,我来帮你搞定这个问题!你遇到的called object type 'char *[10]' is not a function or function pointer报错,主要是变量名和函数名冲突导致的,再加上split函数里还有几个逻辑错误,咱们一步步修正:

问题根源拆解

1. 命名冲突

你在main里定义了char *split[MAX];,这个变量名和你的split函数完全同名!C语言里局部变量会覆盖同名的全局/函数标识符,所以当你调用split(input, split, MAX);时,编译器把第一个split当成了数组变量,而不是函数,自然就报错了。

2. Split函数的逻辑错误

  • 循环条件完全错误:for (int i = 0; split[0] != '\0'; i++)里,split[0]是char*类型,和字符'\0'比较毫无意义,而且初始时数组里的指针都是随机值,这个条件根本起不到控制循环的作用。
  • Strtok参数用错:第二次调用strtok时,你传了buf作为分隔符参数,正确的应该传分隔符字符串(比如" ")——strtok的第二个参数是分隔符集合,不是原字符串。
  • 未分配内存就拷贝:你只声明了指针数组char *split[MAX];,但每个指针都没有指向有效的内存空间,直接用strcpy会导致内存越界、程序崩溃等未定义行为。

修正后的完整代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 10
#define SIZE 256

char *read_line(char *buf, size_t sz) {
    printf("> ");
    fgets(buf, sz, stdin);
    buf[strcspn(buf, "\n")] = 0;
    return buf;
}

// 重命名函数为split_string,避免和变量名冲突
void split_string(char *buf, char *tokens[], size_t max) {
    char *temp = strtok(buf, " ");
    int i = 0;
    // 循环条件:有token可读,且不超过数组最大容量
    while (temp != NULL && i < max) {
        // 为每个token分配足够内存(长度+1存终止符)
        tokens[i] = malloc(strlen(temp) + 1);
        if (tokens[i] == NULL) {
            perror("malloc failed");
            exit(EXIT_FAILURE);
        }
        strcpy(tokens[i], temp);
        temp = strtok(NULL, " "); // 分隔符保持为空格
        i++;
    }
    // 给数组添加NULL终止符,方便后续遍历判断结束
    if (i < max) {
        tokens[i] = NULL;
    }
}

int main(int argc, char **argv) {
    char *buf = malloc(SIZE);
    if (buf == NULL) {
        perror("malloc failed");
        exit(EXIT_FAILURE);
    }
    // 重命名数组为tokens,避免和函数名冲突
    char *tokens[MAX] = {NULL}; // 初始化所有指针为NULL
    while(1) {
        char *input = read_line(buf, SIZE);
        // 先释放上一次拆分分配的内存,防止内存泄漏
        for (int i = 0; tokens[i] != NULL; i++) {
            free(tokens[i]);
            tokens[i] = NULL;
        }
        split_string(input, tokens, MAX);
        
        // 可选:打印拆分结果验证
        printf("拆分后的内容:\n");
        for (int i = 0; tokens[i] != NULL; i++) {
            printf("token[%d]: %s\n", i, tokens[i]);
        }
    }
    // 实际循环不会执行到这里,好习惯是释放内存
    free(buf);
    return 0;
}

关键修改说明

  • 解决命名冲突:把函数名改成split_string,数组名改成tokens,彻底避免标识符混淆。
  • 内存安全:为每个拆分出来的字符串分配独立内存,确保strcpy有合法的存储空间。
  • 正确的循环控制:用temp != NULL && i < max作为循环条件,既保证能读取所有token,又防止数组越界。
  • 修复strtok参数:第二次调用strtok时,分隔符保持为" ",符合函数的使用规范。
  • 内存泄漏预防:每次处理新输入前,释放上一次分配的token内存,避免内存持续占用。
  • 初始化与终止符:初始化数组所有指针为NULL,拆分完成后添加NULL终止符,方便后续遍历判断结束。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:38:58