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

编译警告'int *'与'int'间接级别不同,程序运行崩溃求助

解决'int *' differs in levels of indirection from 'int'警告及程序崩溃问题

首先,咱们先搞清楚这个警告的直接原因:你的struct maze_data里,rows和columns被定义成了int*(指针类型),但在get_data函数里,你肯定是直接把一个普通整数(比如读取到的迷宫行数、列数)赋值给了这两个指针变量。指针变量需要存储的是内存地址,而你给了它一个整数数值,这就导致了类型不匹配——编译器自然会抛出"间接级别不同"的警告。

而程序运行崩溃也和这个错误直接相关:当你把整数赋值给指针时,这个指针会指向一个完全非法的内存地址(比如你把行数5赋值给rows,那rows就会指向0x5这个操作系统不允许访问的区域),后续只要你尝试使用这些指针(比如解引用*rows获取行数),程序就会直接触发崩溃。

接下来给你两种修复方案,推荐第一种:

方案1:修改结构体成员类型(最合理)

既然rows和columns是用来存储迷宫的行数、列数这种数值,完全不需要用指针类型。直接把结构体里的这两个成员改成普通int类型:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct maze_data{
    int* maze_array;
    int* start_location;
    int* end_location;
    int rows;  // 从int*改为int
    int columns;  // 从int*改为int
};

struct maze_data get_data(void);

// 注意:main标准返回类型是int,不是void,避免额外警告
int main(void){
    struct maze_data data_object;
    data_object = get_data();
    // 记得后续要free分配的内存,避免泄漏
    free(data_object.maze_array);
    free(data_object.start_location);
    free(data_object.end_location);
    return 0;
}

struct maze_data get_data(void) {
    char c;
    int i = 0;
    struct maze_data temp;
    
    // 假设你通过某种方式读取到了行数和列数,比如从文件或输入
    temp.rows = 8;  // 直接赋值整数即可
    temp.columns = 8;
    
    // 给maze_array分配内存,这里用rows和columns的数值计算大小
    temp.maze_array = malloc(temp.rows * temp.columns * sizeof(int));
    if (temp.maze_array == NULL) {
        // 内存分配失败的处理,避免崩溃
        fprintf(stderr, "Failed to allocate memory for maze array\n");
        exit(EXIT_FAILURE);
    }
    
    // start_location和end_location如果是存储坐标(比如x,y),也可以分配内存
    temp.start_location = malloc(2 * sizeof(int));
    temp.end_location = malloc(2 * sizeof(int));
    if (temp.start_location == NULL || temp.end_location == NULL) {
        fprintf(stderr, "Failed to allocate memory for locations\n");
        free(temp.maze_array);
        exit(EXIT_FAILURE);
    }
    
    // 这里可以继续填充其他数据,比如start_location[0] = 0; start_location[1] = 0;
    return temp;
}

方案2:保留指针但正确分配内存(不推荐)

如果你确实有特殊需求要保留rows和columns的指针类型,那必须先给这些指针分配内存空间,再把数值存入对应的内存地址:

struct maze_data get_data(void) {
    char c;
    int i = 0;
    struct maze_data temp;
    
    // 先给rows和columns分配内存空间
    temp.rows = malloc(sizeof(int));
    temp.columns = malloc(sizeof(int));
    if (temp.rows == NULL || temp.columns == NULL) {
        fprintf(stderr, "Failed to allocate memory for rows/columns\n");
        exit(EXIT_FAILURE);
    }
    
    // 给指针指向的内存赋值
    *temp.rows = 8;
    *temp.columns = 8;
    
    // 其他成员的内存分配要基于解引用后的数值
    temp.maze_array = malloc(*temp.rows * *temp.columns * sizeof(int));
    // ... 后续的内存检查和赋值逻辑和方案1类似
    
    return temp;
}

这种方式不仅没必要,还会增加内存管理的负担——你后续需要记得free(temp.rows)和free(temp.columns),否则会造成内存泄漏。

最后再提两个注意点:

  • main函数的标准返回类型是int,不要用void,否则有些编译器会抛出警告。
  • 所有用malloc分配的内存,一定要记得检查是否分配成功(判断是否为NULL),并且在使用完后free,避免内存泄漏或者非法内存访问导致的崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:59:04