C语言程序报错:一元运算符‘*’的操作数类型无效(实际为int)
解决C语言文档转单词数组的错误问题
首先,咱们来拆解你遇到的错误原因:
你定义的char *a[1000]是一个指针数组,每个元素都是char*类型,但这些指针在初始化后都是未赋值的野指针——它们没有指向任何有效的内存空间。当你执行*(*(z)+i)=c时,*(z)取到的是数组里的某个char*,但它的值是随机的,甚至可能被编译器解析成非指针类型,这就触发了“一元运算符‘*’的操作数类型无效”的错误。
除此之外,代码还有几个隐藏问题:
getchar()返回的是int类型(要兼容EOF的特殊值),你把它赋值给char类型的c,可能会导致EOF判断出错。- 遇到分隔符时直接重置
i=0,但没有给当前单词添加字符串结束符'\0',会导致后续读取的字符串乱码。 - 没有为每个单词分配内存,直接给野指针赋值会导致内存访问违规。
修正后的代码
#include <stdio.h> #include <ctype.h> #include <string.h> #include <stdlib.h> #define MAX_WORDS 1000 // 最大单词数 #define INIT_WORD_LEN 64 // 每个单词的初始内存大小 int main() { int i = 0; // 当前单词的字符索引 int word_count = 0; // 已读取的单词数 char *words[MAX_WORDS]; // 存储单词的指针数组 int c; // 用int存储getchar的返回值,兼容EOF // 初始化第一个单词的内存 words[word_count] = malloc(INIT_WORD_LEN * sizeof(char)); if (words[word_count] == NULL) { perror("malloc failed"); return 1; } while ((c = getchar()) != EOF) { // 判断是否是分隔符(空格、换行) if (isspace(c)) { // 如果当前有字符(不是连续分隔符),结束当前单词 if (i > 0) { words[word_count][i] = '\0'; // 添加字符串结束符 word_count++; i = 0; // 重置当前单词的索引 // 检查是否超过最大单词数 if (word_count >= MAX_WORDS) { printf("已达到最大单词数上限\n"); break; } // 为下一个单词分配内存 words[word_count] = malloc(INIT_WORD_LEN * sizeof(char)); if (words[word_count] == NULL) { perror("malloc failed"); return 1; } } continue; } // 检查当前单词的内存是否足够,不够则扩容 if (i >= INIT_WORD_LEN - 1) { // 留一个位置给'\0' char *new_ptr = realloc(words[word_count], (INIT_WORD_LEN * 2) * sizeof(char)); if (new_ptr == NULL) { perror("realloc failed"); return 1; } words[word_count] = new_ptr; } // 将字符存入当前单词 words[word_count][i] = c; i++; } // 处理最后一个单词(如果循环结束时还有未完成的单词) if (i > 0) { words[word_count][i] = '\0'; word_count++; } // 打印测试结果 printf("读取到的单词列表:\n"); for (int j = 0; j < word_count; j++) { printf("%d: %s\n", j+1, words[j]); free(words[j]); // 释放内存,避免泄漏 } return 0; }
关键修正点说明
- 用
int类型存储getchar()的返回值,确保EOF判断正确。 - 每个单词初始化时用
malloc分配内存,内存不足时用realloc动态扩容。 - 遇到分隔符时,先为当前单词添加
'\0',再为下一个单词分配内存。 - 最后记得释放所有分配的内存,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Inuxius
相关产品推荐
相关产品推荐

