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

Visual C中strtok函数出现写入位置访问违例错误求助

问题分析与解决

错误根源

你的代码触发访问违例的核心原因是:strtok函数会直接修改传入的原字符串(用\0替换分隔符来分割出token),但你传入的filepath指向的是字符串常量——这类数据存储在程序的只读内存区域,不允许修改,尝试写入就会触发内存访问错误。

另外还有一个逻辑问题:循环结束后filename已经是NULL,此时printf会打印空值甚至崩溃,你需要在循环中保存最后一个有效的token。

修复方案

1. 使用可修改的字符数组存储路径

把字符串常量复制到栈上的字符数组中,数组内存是可修改的:

#define _CRT_SECURE_NO_WARNINGS

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

int main(int argc, char* argv[])
{
    // 用字符数组存储路径,内存可修改
    char filepath[] = "C:\\Users\\RAKESH\\source\\repos\\TESTING\\log.c";
    char* filename = strtok(filepath, "\\");
    char* last_filename = NULL; // 保存最后一个有效token

    while (filename != NULL)
    {
        last_filename = filename; // 更新最后一个有效文件名
        filename = strtok(NULL, "\\");
    }

    if (last_filename != NULL)
    {
        printf("%s\n", last_filename); // 打印最后一个token(文件名)
    }

    return 0;
}

2. 关键知识点说明

  • strtok的工作机制:第一次调用时传入目标字符串,它会在字符串中找到第一个分隔符,替换为\0并返回第一个token的指针;后续调用传入NULL,会从上次的位置继续分割,直到找不到分隔符返回NULL。整个过程必须修改原字符串,因此原字符串必须是可写的。
  • 字符串常量(如char* s = "xxx")是只读的,编译器通常会把它们放到只读数据段,任何修改尝试都会触发内存访问错误。如果需要修改,必须用数组(char s[] = "xxx")或者动态分配内存(malloc+strcpy)来创建可写副本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 11:17:41