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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:22:01