结构体数组运行时错误求助:strcpy相关操作异常排查
问题排查与解决
先直接点出核心问题:你把所有可执行代码都放在了全局作用域(函数外面),这在C语言里是不允许的,会触发未定义行为——这就是操作memories数组时出现运行时错误的根本原因。
具体分析
- C语言明确规定:只有变量的声明或初始化能放在全局作用域,像
strcpy、赋值语句、for循环这类执行逻辑必须放在函数内部(比如main函数)。 - 你操作
mm时看似正常,只是未定义行为的一种“侥幸”表现(刚好没触发崩溃),但这同样是非法代码,绝对不能依赖。
修复步骤
- 把所有执行代码包裹到
main函数里,同时修复类型不匹配的问题:
#include <stdio.h> #include <string.h> #include <stdint.h> struct Memory { char name[50]; char storage[8000]; uint32_t address; int sizeInUse; int memory_id; }; struct Memory mm; struct Memory memories[10]; int main() { strcpy( mm.name, "working file"); mm.address = (uint32_t)&mm.storage; // 强制类型转换,解决指针转uint32_t的类型不匹配 mm.memory_id = -1; mm.sizeInUse = 0; int i,j; for(i=0; i<10; i++){ strcpy( memories[i].name, "file"); memories[i].name[4] = i + 48; memories[i].name[5] = '\0'; memories[i].address = (uint32_t)&memories[i].storage; memories[i].memory_id = i; int index = (i+1)*2; memories[i].sizeInUse = index; for(j=0; j<index; j++){ memories[i].storage[j] = j + 48; } memories[i].storage[index+1] = '~'; } // 可以添加测试输出验证功能 for(i=0; i<10; i++){ printf("Memory %d name: %s\n", i, memories[i].name); } return 0; }
- 关于
address的赋值:&memories[i].storage是指针类型(char*),而address是uint32_t,必须强制类型转换,否则会有编译警告,在64位系统还会导致指针地址截断(丢失高位数据)。
额外注意
- 你注释掉的
initialMemory函数如果是用来初始化内存结构的,建议重新启用——全局变量会默认零初始化,但如果后续改为局部变量,未初始化的结构体成员会引发新的问题。 memories[i].storage[index+1]='~';这部分不会越界:index最大为(9+1)*2=20,index+1=21远小于storage的8000长度,无需担心。
内容的提问来源于stack exchange,提问作者Mr.O
相关产品推荐
相关产品推荐

