编译警告'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
相关产品推荐
相关产品推荐

