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

从文本文件读取数据存入数组时出现指针转整数警告的原因咨询

为什么会出现「assignment makes integer from pointer without a cast」警告?

咱们先拆解这个警告的核心:你正在把一个指针类型的值,直接赋值给一个整数类型的变量,而且没有显式类型转换,编译器就会抛出这个警告。

具体到你的代码问题:

看这两行关键代码:

char arrRequest[100]; // arrRequest是char类型的数组,每个元素都是单个字符(本质是8位整数)
arrRequest[i] = strRow; // 这里触发警告

strRow是char strRow[10];,在C语言里,数组名会被隐式转换成指向数组首元素的指针(也就是char*类型)。而arrRequest[i]是单个char(整数类型),你把一个指针(内存地址,本质是整数但类型不同)直接赋值给它,这就完全不匹配了——相当于你把一个房子的门牌号(指针)直接塞进了一个只能装单个字符的小盒子里,编译器当然会警告你。

你真正想要的应该是存储每行字符串,对吧?那得改两个地方:

  1. 调整数组的类型:如果要存储多个字符串,arrRequest应该是字符串指针数组,或者二维字符数组:

    • 字符串指针数组:char* arrRequest[100];(注意要确保每个指向的内存不会被覆盖,或者动态分配内存)
    • 二维字符数组:char arrRequest[100][10];(提前分配好每个字符串的空间,适合固定长度的行)
  2. 正确复制字符串:不能直接赋值数组名(指针),要用字符串复制函数,比如strcpy:
    比如用二维数组的话,代码改成:

    char arrRequest[100][10]; 
    char strRow[10]; 
    int i = 0;
    
    void request(){
        // 加终止条件避免无限循环和数组越界
        while (fgets(strRow, 10, fp) != NULL && i < 99) { 
            strcpy(arrRequest[i], strRow); // 复制字符串到arrRequest的第i行
            printf("value of %d is %s:\n", i, arrRequest[i]);
            i++;
        }
    }
    

    要是用指针数组,记得要给每个指针分配内存(比如用strdup或者malloc+strcpy),不然会出现野指针问题:

    char* arrRequest[100]; 
    char strRow[10]; 
    int i = 0;
    
    void request(){
        while (fgets(strRow, 10, fp) != NULL && i < 99) { 
            arrRequest[i] = strdup(strRow); // 复制字符串并分配内存
            printf("value of %d is %s:\n", i, arrRequest[i]);
            i++;
        }
        // 记得最后释放动态分配的内存
        for (int j = 0; j < i; j++) {
            free(arrRequest[j]);
        }
    }
    

另外提个小建议:你的原代码是for(;;)无限循环,一定要加上终止条件(比如fgets返回NULL表示文件读完了),不然会越界访问数组,导致程序崩溃哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 11:57:30