C语言定义含字符串矩阵的结构体时编译报错问题求助
问题修复方案
错误原因逐一说明
- 错误1:
char (*matrice)(SO_REGISTRY_SIZE);定义语法错误。你写的是返回值为char、入参为1个int的函数指针,完全不符合字符串矩阵的需求,宏展开后编译器无法识别这种语法所以抛错。你需要的是存储字符串(char*类型)的二维数组,正确的成员定义应该是char* matrice[SO_REGISTRY_SIZE][SO_BLOCK_SIZE]; - 错误2和错误3都是错误1的连锁问题:第一个语法错误导致结构体
libroMastro的定义不完整,编译器会判定结构体没有matrice成员,同时抛出结构体定义不完整的相关警告。 - 额外逻辑问题:
whatIndex函数中内层循环的j没有在每次外层循环时重置为0,遍历完第一行后j就固定为SO_BLOCK_SIZE,后续行不会被遍历main函数中定义的libroMastro *libro是野指针,没有分配内存也没有初始化,运行时会触发段错误- 结构体成员矩阵需要初始化所有元素为
NULL,否则判断== NULL的逻辑会出错
修复后完整代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #define BUF_SIZE 64 #define SO_REGISTRY_SIZE 10 #define SO_BLOCK_SIZE 5 typedef struct libroMastro{ // 二维数组:SO_REGISTRY_SIZE行,SO_BLOCK_SIZE列,每个元素是字符串指针 char* matrice[SO_REGISTRY_SIZE][SO_BLOCK_SIZE]; }libroMastro; int whatIndex(libroMastro *libro){ int count = 0; for(int i = 0; i < SO_REGISTRY_SIZE; i++){ // 每次遍历新行都重置j为0 for(int j = 0; j < SO_BLOCK_SIZE; j++){ if(libro->matrice[i][j] != NULL){ count++; }else{ // 找到第一个空位就返回已存数量,也可以按需求修改逻辑 return count; } } } // 所有位置都存满时返回总存储数 return count; } int main(){ // 分配结构体内存 libroMastro *libro = malloc(sizeof(libroMastro)); if(libro == NULL){ perror("malloc failed"); return 1; } // 初始化矩阵所有元素为NULL memset(libro, 0, sizeof(libroMastro)); // 测试可自行添加写入逻辑,例如: // libro->matrice[0][0] = "hello"; // libro->matrice[0][1] = "world"; printf("已存储字符串数量:%d\n", whatIndex(libro)); // 释放内存 free(libro); return 0; }
内容的提问来源于stack exchange,提问作者hawk
相关产品推荐
相关产品推荐

