拆分字符串存入数组遇错误:‘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
相关产品推荐
相关产品推荐

