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

结构体数组运行时错误求助:strcpy相关操作异常排查

问题排查与解决

先直接点出核心问题:你把所有可执行代码都放在了全局作用域(函数外面),这在C语言里是不允许的,会触发未定义行为——这就是操作memories数组时出现运行时错误的根本原因。

具体分析

  • C语言明确规定:只有变量的声明或初始化能放在全局作用域,像strcpy、赋值语句、for循环这类执行逻辑必须放在函数内部(比如main函数)。
  • 你操作mm时看似正常,只是未定义行为的一种“侥幸”表现(刚好没触发崩溃),但这同样是非法代码,绝对不能依赖。

修复步骤

  1. 把所有执行代码包裹到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;
}
  1. 关于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:17:27