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

Visual Studio中C语言struct内存分配出现访问违例错误如何解决

C语言自定义String结构体CreateString函数问题修复

错误原因排查

  • 字符串内存分配长度错误:strlen()返回的长度不包含C字符串末尾必需的\0结束符,你当前分配的len1 * sizeof(char)空间不足以存储完整的字符串,后续操作字符串会出现越界访问。
  • 指针赋值错误而非内容拷贝:cpysource = source;是直接修改了cpysource指针的指向,让它指向了入参source对应的地址,完全没有用到你之前malloc申请的堆内存,既造成了内存泄漏,还会导致后续如果修改newString->str指向的内容时,若source是存储在只读内存段的常量字符串,就会直接触发访问违例,这是你遇到报错的核心原因。
  • 缺少内存分配成功校验:两次malloc都没有判断返回值是否为NULL,极端情况下内存分配失败会引发空指针访问错误。

正确实现方案

使用strcpy将source的内容拷贝到申请的堆内存中,不要直接给指针赋值,同时修正内存分配长度,增加空指针校验:

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

typedef struct {
    char* str;
} String;

String* CreateString(const char* source)
{
    // 入参非空校验
    if (source == NULL) {
        return NULL;
    }
    // 计算长度时加1存储结束符\0
    int len = strlen(source);
    char* cpysource = (char*)malloc((len + 1) * sizeof(char));
    // 校验malloc是否成功
    if (cpysource == NULL) {
        return NULL;
    }
    // 拷贝字符串内容到申请的堆内存,不是直接赋值指针
    strcpy(cpysource, source);
    
    String* newString = (String*)malloc(sizeof(String));
    if (newString == NULL) {
        // 分配失败要释放之前申请的内存,避免泄漏
        free(cpysource);
        return NULL;
    }
    newString->str = cpysource;
    return newString;
}

补充注意事项

使用完String结构体后,要先释放结构体内部的str指针,再释放结构体本身,避免内存泄漏:

void DestroyString(String* str)
{
    if (str != NULL) {
        free(str->str);
        free(str);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 01:18:00